From e8b1060a2e5f958d9745ce5f8738b27c160b3ef8 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Wed, 5 May 2021 11:41:57 +0200 Subject: [PATCH] Copy/pasta over keycloak base theme --- .gitignore | 85 + account/resources/css/account.css | 277 + account/resources/img/icon-sidebar-active.png | Bin 0 -> 202 bytes account/resources/img/keycloak-logo.png | Bin 0 -> 5213 bytes account/resources/img/logo.png | Bin 0 -> 4156 bytes account/theme.properties | 14 + admin/resources/css/styles.css | 501 + admin/resources/img/keyclok-logo.png | Bin 0 -> 5268 bytes admin/resources/img/keyclok-logo.svg | 194 + admin/resources/img/select-arrow.png | Bin 0 -> 1154 bytes admin/theme.properties | 5 + common/resources/img/favicon.ico | Bin 0 -> 627 bytes common/resources/lib/angular/errors.json | 1 + common/resources/lib/angular/treeview/LICENSE | 20 + .../resources/lib/angular/treeview/README.md | 122 + .../lib/angular/treeview/angular.treeview.js | 97 + .../angular/treeview/angular.treeview.min.js | 9 + .../angular/treeview/css/angular.treeview.css | 99 + .../lib/angular/treeview/img/file.png | Bin 0 -> 263 bytes .../angular/treeview/img/folder-closed.png | Bin 0 -> 281 bytes .../lib/angular/treeview/img/folder.png | Bin 0 -> 289 bytes .../lib/angular/ui-bootstrap-tpls-0.11.0.js | 4116 ++++ common/resources/lib/angular/version.json | 1 + common/resources/lib/filesaver/FileSaver.js | 188 + .../resources/lib/fileupload/FileAPI.min.js | 72 + .../angular-file-upload-html5-shim.js | 25 + .../angular-file-upload-html5-shim.min.js | 2 + .../fileupload/angular-file-upload-shim.js | 215 + .../angular-file-upload-shim.min.js | 2 + .../lib/fileupload/angular-file-upload.js | 156 + .../lib/fileupload/angular-file-upload.min.js | 2 + common/resources/lib/pficon/pficon.css | 21 + common/resources/lib/pficon/pficon.woff | Bin 0 -> 19456 bytes common/resources/lib/pficon/pficon.woff2 | Bin 0 -> 16296 bytes common/resources/lib/ui-ace/ace.js | 18673 ++++++++++++++++ common/resources/lib/ui-ace/min/ace.js | 11 + .../lib/ui-ace/min/mode-javascript.js | 1 + .../resources/lib/ui-ace/min/theme-github.js | 1 + .../lib/ui-ace/min/worker-javascript.js | 1 + .../resources/lib/ui-ace/mode-javascript.js | 1140 + common/resources/lib/ui-ace/theme-github.js | 103 + common/resources/lib/ui-ace/ui-ace.js | 328 + common/resources/lib/ui-ace/ui-ace.min.js | 7 + .../resources/lib/ui-ace/worker-javascript.js | 12530 +++++++++++ .../lib/zocial/zocial-regular-webfont.eot | Bin 0 -> 25722 bytes .../lib/zocial/zocial-regular-webfont.svg | 1107 + .../lib/zocial/zocial-regular-webfont.ttf | Bin 0 -> 25552 bytes .../lib/zocial/zocial-regular-webfont.woff | Bin 0 -> 17736 bytes common/resources/lib/zocial/zocial.css | 505 + common/resources/package.json | 29 + email/theme.properties | 1 + login/resources/css/login.css | 688 + login/resources/css/tile.css | 207 + .../img/feedback-error-arrow-down.png | Bin 0 -> 513 bytes login/resources/img/feedback-error-sign.png | Bin 0 -> 343 bytes .../img/feedback-success-arrow-down.png | Bin 0 -> 678 bytes login/resources/img/feedback-success-sign.png | Bin 0 -> 410 bytes .../img/feedback-warning-arrow-down.png | Bin 0 -> 513 bytes login/resources/img/feedback-warning-sign.png | Bin 0 -> 646 bytes login/resources/img/keycloak-bg.png | Bin 0 -> 81862 bytes login/resources/img/keycloak-logo-text.png | Bin 0 -> 19994 bytes login/resources/img/keycloak-logo.png | Bin 0 -> 5281 bytes login/theme.properties | 130 + welcome/index.ftl | 137 + welcome/resources/admin-console.png | Bin 0 -> 712 bytes welcome/resources/alert.png | Bin 0 -> 6189 bytes welcome/resources/bg.png | Bin 0 -> 72796 bytes welcome/resources/bug.png | Bin 0 -> 1397 bytes welcome/resources/css/welcome.css | 140 + welcome/resources/jboss_community.png | Bin 0 -> 3204 bytes welcome/resources/keycloak-project.png | Bin 0 -> 1611 bytes welcome/resources/keycloak_logo.png | Bin 0 -> 7539 bytes welcome/resources/logo.png | Bin 0 -> 7539 bytes welcome/resources/mail.png | Bin 0 -> 1037 bytes welcome/resources/user.png | Bin 0 -> 2423 bytes welcome/theme.properties | 7 + 76 files changed, 41970 insertions(+) create mode 100644 .gitignore create mode 100644 account/resources/css/account.css create mode 100644 account/resources/img/icon-sidebar-active.png create mode 100644 account/resources/img/keycloak-logo.png create mode 100644 account/resources/img/logo.png create mode 100644 account/theme.properties create mode 100755 admin/resources/css/styles.css create mode 100644 admin/resources/img/keyclok-logo.png create mode 100644 admin/resources/img/keyclok-logo.svg create mode 100644 admin/resources/img/select-arrow.png create mode 100755 admin/theme.properties create mode 100644 common/resources/img/favicon.ico create mode 100644 common/resources/lib/angular/errors.json create mode 100644 common/resources/lib/angular/treeview/LICENSE create mode 100644 common/resources/lib/angular/treeview/README.md create mode 100755 common/resources/lib/angular/treeview/angular.treeview.js create mode 100644 common/resources/lib/angular/treeview/angular.treeview.min.js create mode 100755 common/resources/lib/angular/treeview/css/angular.treeview.css create mode 100644 common/resources/lib/angular/treeview/img/file.png create mode 100644 common/resources/lib/angular/treeview/img/folder-closed.png create mode 100644 common/resources/lib/angular/treeview/img/folder.png create mode 100644 common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js create mode 100755 common/resources/lib/angular/version.json create mode 100644 common/resources/lib/filesaver/FileSaver.js create mode 100644 common/resources/lib/fileupload/FileAPI.min.js create mode 100644 common/resources/lib/fileupload/angular-file-upload-html5-shim.js create mode 100644 common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js create mode 100644 common/resources/lib/fileupload/angular-file-upload-shim.js create mode 100644 common/resources/lib/fileupload/angular-file-upload-shim.min.js create mode 100644 common/resources/lib/fileupload/angular-file-upload.js create mode 100644 common/resources/lib/fileupload/angular-file-upload.min.js create mode 100644 common/resources/lib/pficon/pficon.css create mode 100644 common/resources/lib/pficon/pficon.woff create mode 100644 common/resources/lib/pficon/pficon.woff2 create mode 100644 common/resources/lib/ui-ace/ace.js create mode 100644 common/resources/lib/ui-ace/min/ace.js create mode 100644 common/resources/lib/ui-ace/min/mode-javascript.js create mode 100644 common/resources/lib/ui-ace/min/theme-github.js create mode 100644 common/resources/lib/ui-ace/min/worker-javascript.js create mode 100644 common/resources/lib/ui-ace/mode-javascript.js create mode 100644 common/resources/lib/ui-ace/theme-github.js create mode 100644 common/resources/lib/ui-ace/ui-ace.js create mode 100644 common/resources/lib/ui-ace/ui-ace.min.js create mode 100644 common/resources/lib/ui-ace/worker-javascript.js create mode 100644 common/resources/lib/zocial/zocial-regular-webfont.eot create mode 100644 common/resources/lib/zocial/zocial-regular-webfont.svg create mode 100644 common/resources/lib/zocial/zocial-regular-webfont.ttf create mode 100644 common/resources/lib/zocial/zocial-regular-webfont.woff create mode 100644 common/resources/lib/zocial/zocial.css create mode 100644 common/resources/package.json create mode 100644 email/theme.properties create mode 100644 login/resources/css/login.css create mode 100644 login/resources/css/tile.css create mode 100644 login/resources/img/feedback-error-arrow-down.png create mode 100644 login/resources/img/feedback-error-sign.png create mode 100644 login/resources/img/feedback-success-arrow-down.png create mode 100644 login/resources/img/feedback-success-sign.png create mode 100644 login/resources/img/feedback-warning-arrow-down.png create mode 100644 login/resources/img/feedback-warning-sign.png create mode 100644 login/resources/img/keycloak-bg.png create mode 100644 login/resources/img/keycloak-logo-text.png create mode 100644 login/resources/img/keycloak-logo.png create mode 100644 login/theme.properties create mode 100755 welcome/index.ftl create mode 100644 welcome/resources/admin-console.png create mode 100644 welcome/resources/alert.png create mode 100644 welcome/resources/bg.png create mode 100644 welcome/resources/bug.png create mode 100644 welcome/resources/css/welcome.css create mode 100644 welcome/resources/jboss_community.png create mode 100644 welcome/resources/keycloak-project.png create mode 100644 welcome/resources/keycloak_logo.png create mode 100644 welcome/resources/logo.png create mode 100644 welcome/resources/mail.png create mode 100644 welcome/resources/user.png create mode 100644 welcome/theme.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..495e642 --- /dev/null +++ b/.gitignore @@ -0,0 +1,85 @@ +# OS stuff +################### +.DS_Store + +# Intellij +################### +.idea +*.iml + +# Eclipse # +########### +.project +.settings +.classpath +# reverting this as e.g. /distribution/feature-packs/server-feature-pack/src/main/resources/content/bin/ +# should not be ignored +#bin/ +.factorypath + + +# NetBeans # +############ +nbactions.xml +nb-configuration.xml +catalog.xml +nbproject + +# VS Code # +########### +*.code-workspace + +# Compiled source # +################### +*.com +*.class +*.dll +*.exe +*.o +*.so + +# Packages # +############ +# it's better to unpack these files and commit the raw source +# git has its own built in compression methods +*.7z +*.dmg +*.gz +*.iso +*.jar +*.rar +*.tar +*.zip + +# Python byte-compiled files # +############################## +*.pyc + +# Logs and databases # +###################### +*.log +.attach_pid* + +# Maven # +######### +target + +# Maven shade +############# +*dependency-reduced-pom.xml + +# nodejs # +########## +# KEYCLOAK-5391: We will re-exclude node_modules when node_modules handling is worked out. +# For now, we keep our js libraries checked into GitHub, so we don't ignore. +node +node_modules +web_modules + +# testsuite # +############# +*offline-token.txt + +# Quarkus ephemeral data # +########################## +quarkus/data/*.db diff --git a/account/resources/css/account.css b/account/resources/css/account.css new file mode 100644 index 0000000..3878e43 --- /dev/null +++ b/account/resources/css/account.css @@ -0,0 +1,277 @@ +html { + height: 100%; +} + +body { + background-color: #F9F9F9; + margin: 0; + padding: 0; + height: 100%; +} + +header .navbar { + margin-bottom: 0; + min-height: inherit; +} + +.header .container { + position: relative; +} + +.navbar-title { + background-image: url('../img/logo.png'); + height: 25px; + background-repeat: no-repeat; + width: 123px; + margin: 3px 10px 5px; + text-indent: -99999px; +} + +.navbar-pf .navbar-utility { + right: 20px; + top: -34px; + font-size: 12px; +} + +.navbar-pf .navbar-utility > li > a { + color: #fff !important; + padding-bottom: 12px; + padding-top: 11px; + border-left: medium none; +} + +.container { + height: 100%; +} + +.content-area { + background-color: #fff; + border-color: #CECECE; + border-style: solid; + border-width: 0 1px; + height: 100%; + padding: 0 30px; +} + +.margin-bottom { + margin-bottom: 10px; +} + +/* Sidebar */ + +.bs-sidebar { + background-color: #f9f9f9; + padding-top: 44px; + padding-right: 0; + padding-left: 0; + z-index: 20; +} +.bs-sidebar ul { + list-style: none; + padding-left: 12px; +} + +.bs-sidebar ul li { + margin-bottom: 0.5em; + margin-left: -1em; +} +.bs-sidebar ul li a { + font-size: 14px; + padding-left: 25px; + color: #4d5258; + line-height: 28px; + display: block; + border-width: 1px 0 1px 1px; + border-style: solid; + border-color: #f9f9f9; +} +.bs-sidebar ul li a:hover, +.bs-sidebar ul li a:focus { + text-decoration: none; + color: #777777; + border-right: 2px solid #aaa; +} +.bs-sidebar ul li.active a { + background-color: #c7e5f0; + border-color: #56bae0; + font-weight: bold; + background-image: url(../img/icon-sidebar-active.png); + background-repeat: no-repeat; + background-position: right center; +} + +.bs-sidebar ul li.active a:hover { + border-right: none; +} + + +.content-area h2 { + font-family: "Open Sans", sans-serif; + font-weight: 100; + font-size: 24px; + margin-bottom: 25px; + margin-top: 25px; +} + +.subtitle { + text-align: right; + margin-top: 30px; + color: #909090; +} + +.required { + color: #CB2915; +} + + +.alert { + margin-top: 30px; + margin-bottom: 0; +} + +.feedback-aligner .alert { + background-position: 1.27273em center; + background-repeat: no-repeat; + border-radius: 2px; + border-width: 1px; + color: #4D5258; + display: inline-block; + font-size: 1.1em; + line-height: 1.4em; + margin: 0; + padding: 0.909091em 3.63636em; + position: relative; + text-align: left; +} +.alert.alert-success { + background-color: #E4F1E1; + border-color: #4B9E39; +} +.alert.alert-error { + background-color: #F8E7E7; + border-color: #B91415; +} +.alert.alert-warning { + background-color: #FEF1E9; + border-color: #F17528; +} +.alert.alert-info { + background-color: #E4F3FA; + border-color: #5994B2; +} + +.form-horizontal { + border-top: 1px solid #E9E8E8; + padding-top: 23px; +} + +.form-horizontal .control-label { + color: #909090; + line-height: 1.4em; + padding-top: 5px; + position: relative; + text-align: right; + width: 100%; +} + +.form-group { + position: relative; +} + +.control-label + .required { + position: absolute; + right: -2px; + top: 0; +} + +#kc-form-buttons { + text-align: right; + margin-top: 10px; +} + +#kc-form-buttons .btn-primary { + float: right; + margin-left: 8px; +} + +/* Authenticator page */ + +ol { + padding-left: 40px; +} + +ol li { + font-size: 13px; + margin-bottom: 10px; + position: relative; +} + +ol li img { + margin-top: 15px; + margin-bottom: 5px; + border: 1px solid #eee; +} + +hr + .form-horizontal { + border: none; + padding-top: 0; +} + +.kc-dropdown{ + position: relative; +} +.kc-dropdown > a{ + display:block; + padding: 11px 10px 12px; + line-height: 12px; + font-size: 12px; + color: #fff !important; + text-decoration: none; +} +.kc-dropdown > a::after{ + content: "\2c5"; + margin-left: 4px; +} +.kc-dropdown:hover > a{ + background-color: rgba(0,0,0,0.2); +} +.kc-dropdown ul li a{ + padding: 1px 11px; + font-size: 12px; + color: #000 !important; + border: 1px solid #fff; + text-decoration: none; + display:block; + line-height: 20px; +} +.kc-dropdown ul li a:hover{ + color: #4d5258; + background-color: #d4edfa; + border-color: #b3d3e7; +} +.kc-dropdown ul{ + position: absolute; + z-index: 2000; + list-style:none; + display:none; + padding: 5px 0px; + margin: 0px; + background-color: #fff !important; + border: 1px solid #b6b6b6; + border-radius: 1px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; + min-width: 100px; +} +.kc-dropdown:hover ul{ + display:block; +} + + +#kc-totp-secret-key { + border: 1px solid #eee; + font-size: 16px; + padding: 10px; + margin: 50px 0; +} \ No newline at end of file diff --git a/account/resources/img/icon-sidebar-active.png b/account/resources/img/icon-sidebar-active.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b9b082836b728286e1962f7d2efc81ddbe0b71 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^;y}#D!3HFcd~W{?q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c73FxkIEGZ*N=jIun2<7~^e}_RcjiI`=UK zVCeYHtShu&-DyXLq!)E7W+-p1Ilz&A@c@&Xh}=}&gd+kA7qR+CC9YLuAP#kTzP zOOabP0l+XkKxNbyD literal 0 HcmV?d00001 diff --git a/account/resources/img/keycloak-logo.png b/account/resources/img/keycloak-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..955574855d493cc248e112b7d755a95d641613f8 GIT binary patch literal 5213 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 span { + -moz-box-sizing: border-box; + color: white; + float: left; + font-size: 11px; + font-family: "Open Sans", sans-serif; + font-weight: bold; + height: 24px; + line-height: 24px; + padding: 0; + width: 50%; +} +.onoffswitch .onoffswitch-switch { + background-image: linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -o-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -moz-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -webkit-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -ms-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fafafa), color-stop(1, 0, #ededed)); + border: 1px solid #aaa; + border-radius: 2px; + bottom: 0; + margin: 0; + position: absolute; + right: 39px; + top: 0; + transition: all 0.3s ease-in 0s; + -webkit-transition: all 0.3s ease-in 0s; + width: 23px; +} +.onoffswitch .onoffswitch-inner .onoffswitch-active { + background-image: linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -o-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -moz-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -webkit-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -ms-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #00a9ec), color-stop(1, 0, #009bd3)); + color: #FFFFFF; + padding-left: 10px; +} +.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner .onoffswitch-active, +.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner .onoffswitch-inactive { + background-image: none; + background-color: #e5e5e5; + color: #9d9fa1; +} +.onoffswitch .onoffswitch-inner .onoffswitch-inactive { + background: linear-gradient(#fefefe, #e8e8e8) repeat scroll 0 0 transparent; + color: #4d5258; + padding-right: 10px; + text-align: right; +} +.onoffswitch .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner { + margin-left: 0; +} +.onoffswitch .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch { + right: 0; +} + + +/*********** Select 2 ***********/ + +.select2-container { + width: 100%; +} + +.select2-container-multi .select2-choices .select2-search-field { + height: 26px; +} + +.select2-container-single { + padding: 0; + margin: 0; +} + +.select2-container-single .form-group { + width: 100%; + margin: 0; +} + +.select2-container-single .form-group .input-group { + width: 100%; +} + +/*********** html select ********/ +.overflow-select { + overflow: auto; +} + + +/*********** New Menu ***********/ + + +.sidebar-pf-left{ + background: #292e34; +} + +.sidebar-pf .nav-pills > li a i, .sidebar-pf .nav-pills > li a span{ + color: #72767b; + display: inline-block; + margin-right: 10px; +} +.sidebar-pf .nav-pills > li > a{ + color: #dbdada; + padding: 0px 20px 0 30px!important; + line-height: 30px; + border-left-width: 12px; + border-left-style: solid; + border-left-color: #292e34; + margin-left: -6px; +} + +.sidebar-pf .nav-pills > li > a:hover{ + background: #393f44; + border-color:#292e34; + border-left-color: #393f44; + color: #fff; +} + +.sidebar-pf .nav-pills > li > a:after{ + display: none!important; +} + + +.sidebar-pf .nav-pills > li.active > a { + color: #fff; + background: #393f44!important; + border-bottom: 1px solid #000!important; + border-top: 1px solid #000!important; + border-left-color: #39a5dc!important; +} + +.sidebar-pf .nav-pills > li.active a i, .sidebar-pf .nav-pills > li.active a span{ + color: #39a5dc; +} + +/*********** Realm selector ***********/ + +.realm-selector{ + color: #fff; + margin: 0 -20px; + position: relative; +} + +.realm-dropmenu{ + display: none; + cursor: pointer; + position: absolute; + top: 60px; + left: 0; + right: 0; + z-index: 999; + background: #fff; +} + +.realm-selector:hover .realm-dropmenu{ + display: block; +} + +.realm-add{ + padding: 10px; +} + +.realm-selector h2{ + font-size: 16px; + line-height: 60px; + padding: 0 20px; + margin: 0; + border-bottom: 1px solid #d5d5d6; +} + +.realm-selector h2 i{ + display: inline-block; + float: right; + line-height: 60px; +} + + +.realm-selector ul{ + padding-left: 0; + margin: 0; + list-style: none; + max-height: 200px; + overflow-y:auto; +} + + +.realm-selector ul li a{ + line-height: 60px; + padding: 0 20px; + border-bottom: 1px solid #d5d5d6; + line-height: 39px; + display: block; + font-size: 14px; +} + + +/*********** Overwrites header defaults ***********/ + +.navbar-pf{ + border-top: none!important; +} + +.navbar-pf .navbar-brand { + padding: 0; + height: 56px; + line-height: 56px; + background-position: center center; + background-image: url('../img/keyclok-logo.png'); + background-size: 148px 30px; + background-repeat: no-repeat; + width: 148px; +} + +.navbar-pf .navbar-utility .dropdown-toggle { + padding: 23px !important; +} + +.clickable { + cursor: pointer; +} + +h1 i { + color: #999999; + font-size: 18px; + margin-left: 10px; +} + +/* Action cell */ +.kc-action-cell { + background-color: #eeeeee; + background-image: linear-gradient(to bottom, #fafafa 0%, #ededed 100%); + background-repeat: repeat-x; + + text-align: center; + vertical-align: middle; + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + cursor:pointer; +} + +.kc-action-cell:hover { + background-color: #eeeeee; + background-image: none; +} + +.kc-action-cell-disabled { + background-color: #fafafa; + color: #8b8d8f; + background-image: none; + cursor: not-allowed; +} + +.kc-sorter span { + margin-left: 10px; +} + + +/* Time selector */ + +.time-selector input { + display: inline-block; + width: 120px; + padding-right: 0; + margin-right: 0; +} + +.time-selector select { + display: inline-block; + width: 80px; + margin-left: 0; + padding-left: 0; +} + +.ace_editor { + height: 600px; + width: 100%; +} + +.kc-button-input-file input { + float: left; + width: 73%; +} + +.kc-button-input-file label { + float: left; + margin-left: 2%; + width: 25%; +} + +table.kc-authz-table-expanded { + margin-top: 0px !important; +} + +.no-gutter > [class*='col-'] { + padding-right:0!important; + padding-left:0!important; +} + +.password-conceal { + font-family: 'text-security-disc'; + font-size: 14px; +} + +/* Deactivation styles for user-group membership tree models */ + +div[tree-model] li .deactivate { + color: #4a5053; + opacity: 0.4; +} + +div[tree-model] li .deactivate_selected { + background-color: #dcdcdc; + font-weight: bold; + padding: 1px 5px; +} + +/* search highlighting */ + +div[tree-model] li .highlight { + background-color: #aaddff; +} + +/* Manage credentials */ +table.credentials-table { + margin-top: 0; + margin-bottom: 20px; +} + +table.credentials-table td { + vertical-align: middle !important; +} + +table.credentials-table input[type='text'] { + width: 100%; +} + +td.credential-arrows-cell { + width: 75px; +} + +td.credential-label-cell { + padding: 5px !important; +} + +td.credential-action-cell { + padding: 0px !important; +} + +td.credential-action-cell div.kc-action-cell { + width: 100%; + height: 36px; + line-height: 34px; +} + +td.credential-action-cell.expanded div.kc-action-cell { + border-bottom: 1px solid #d1d1d1; +} + +table.credential-data-table td { + word-break: break-all; +} + +table.credential-data-table tr:first-child td { + border-top: 0; +} + +table.credential-data-table td:first-child { + width: 150px; +} + +table.credential-data-table td.key { + text-align: right; + font-weight: bold; +} + diff --git a/admin/resources/img/keyclok-logo.png b/admin/resources/img/keyclok-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ca53f0a04ba97029b387ada299ae4b454b54ccd4 GIT binary patch literal 5268 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 akN*dX+`h$pZtd{^0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/resources/img/select-arrow.png b/admin/resources/img/select-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a865a6fa7324e054cffa6e1878d69438780b20c7 GIT binary patch literal 1154 zcmbVMTWHfz7>p*_>aXo9GTd$y`I14I@;lVM5JhweKRY3LHQC7fY1b^;WQwQUZl zZ_DPjwq`A+Q}I<~jVEFP6CjoJ%#!7boBlvw?V=p`?Z&9uZobt9Ob)oP#nEs*8W&c;ICuXx!@E2M)bdlwvIE#@G8ws*Pl;dI?8%xx(sU$BXLTpf}aEyknRX9Ex zim)s%ggGwB*G7`bSSXr`29=P4X)D;YTqMb3NA3NLQ&>ArT2 zA9uH-Ywx;_@dpP62I76EH_hHudfZ-m_3_D@=eypgs=j~y@N$1<+s2d9fz493b7t>b zdi$;G;Cc4Oy<=aF_s6}ZOI9R~$+;sl=AP@Cwm_P2^Y!Ofnm`u?`7EDZT zU@#004h&*6qDT$3A+1HARIlxQw0Gw~Fqjw}@R{Bx@00f{&kMVRw3Fz%ejPaV7yTE* zFfRVFfUfKNfww^PA5AYAhLPDOVn^Z@5Uq#8eCj{K^1uiH-%|sWPn^Z+JGia8uj_ip zZxduPnQOLfKTs5fNvoYXN5LH&;bDG;iSDDcboJ0G%bfWzLoC#S@B5!sRW1H1Fh4(U zCK8G8Z0;+U=JG_6dl~BMWvaKyqfNox4TZyDm6NS?PHPsf>mtkY)(X?p)044SEDSKQ zTqY7~#q8?iUXO?Cx}0ybNC=-sv&nO(ja);Zsw$GSbv}_!r^h5o;>pJq=GIKi)BxwS zIvtLQX_~mM%k55!1cRzr-Bk6$hn3YADC!p(StiU*sn$CQ!;;MuB0(GzS&ySNfE*{22sK>&cF zD98ZA!^0c7Ty9jX6mNc<6~^+fSY63eDwURie5q8*?sVcL zaG@TFvod&`Xu~G?W|nd+MRD*L$@~KG!V to the top of your HTML document. See http://docs.angularjs.org/api/ng.$sce for more information.","unsafe":"Attempting to use an unsafe value in a safe context.","itype":"Attempted to trust a non-string value in a content requiring a string: Context: {0}"},"ngPattern":{"noregexp":"Expected {0} to be a RegExp but was {1}. Element: {2}"},"$controller":{"ctrlfmt":"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.","noscp":"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`."},"$parse":{"isecfn":"Referencing Function in Angular expressions is disallowed! Expression: {0}","isecwindow":"Referencing the Window in Angular expressions is disallowed! Expression: {0}","ueoe":"Unexpected end of expression: {0}","isecdom":"Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}","lexerr":"Lexer Error: {0} at column{1} in expression [{2}].","esc":"IMPOSSIBLE","isecobj":"Referencing Object in Angular expressions is disallowed! Expression: {0}","lval":"Trying to assing a value to a non l-value","isecff":"Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}","syntax":"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].","isecfld":"Attempting to access a disallowed field in Angular expressions! Expression: {0}"},"jqLite":{"offargs":"jqLite#off() does not support the `selector` argument","onargs":"jqLite#on() does not support the `selector` or `eventData` parameters","nosel":"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element"},"$animate":{"notcsel":"Expecting class selector starting with '.' got '{0}'.","nongcls":"$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class."},"$q":{"norslvr":"Expected resolverFn, got '{0}'","qcycle":"Expected promise to be resolved with value other than itself '{0}'"},"$injector":{"pget":"Provider '{0}' must define $get factory method.","cdep":"Circular dependency found: {0}","nomod":"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.","strictdi":"{0} is not using explicit annotation and cannot be invoked in strict mode","modulerr":"Failed to instantiate module {0} due to:\n{1}","undef":"Provider '{0}' must return a value from $get factory method.","unpr":"Unknown provider: {0}","itkn":"Incorrect injection token! Expected service name as string, got {0}"},"filter":{"notarray":"Expected array but received: {0}"},"ngTransclude":{"orphan":"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}"},"ngModel":{"nonassign":"Expression '{0}' is non-assignable. Element: {1}","datefmt":"Expected `{0}` to be a date","$asyncValidators":"Expected asynchronous validator to return a promise but got '{0}' instead.","constexpr":"Expected constant expression for `{0}`, but saw `{1}`.","numfmt":"Expected `{0}` to be a number"},"$location":{"nostate":"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API","ipthprfx":"Invalid url \"{0}\", missing path prefix \"{1}\".","isrcharg":"The first argument of the `$location#search()` call must be a string or an object.","nobase":"$location in HTML5 mode requires a tag to be present!"},"$cacheFactory":{"iid":"CacheId '{0}' is already taken!"},"$interpolate":{"noconcat":"Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce","interr":"Can't interpolate: {0}\n{1}","nochgmustache":"angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.","reqcomma":"Expected a comma after the keyword “{0}†at line {1}, column {2} of text “{3}â€","untermstr":"The string beginning at line {0}, column {1} is unterminated in text “{2}â€","badexpr":"Unexpected operator “{0}†at line {1}, column {2} in text. Was expecting “{3}â€. Text: “{4}â€","dupvalue":"The choice “{0}†is specified more than once. Duplicate key is at line {1}, column {2} in text “{3}â€","unsafe":"Use of select/plural MessageFormat syntax is currently disallowed in a secure context ({0}). At line {1}, column {2} of text “{3}â€","reqother":"“other†is a required option.","reqendinterp":"Expecting end of interpolation symbol, “{0}â€, at line {1}, column {2} in text “{3}â€","reqarg":"Expected one of “plural†or “select†at line {0}, column {1} of text “{2}â€","wantstring":"Expected the beginning of a string at line {0}, column {1} in text “{2}â€","logicbug":"The messageformat parser has encountered an internal error. Please file a github issue against the AngularJS project and provide this message text that triggers the bug. Text: “{0}â€","reqopenbrace":"The plural choice “{0}†must be followed by a message in braces at line {1}, column {2} in text “{3}â€","unknarg":"Unsupported keyword “{0}†at line {0}, column {1}. Only “plural†and “select†are currently supported. Text: “{3}â€","reqendbrace":"The plural/select choice “{0}†message starting at line {1}, column {2} does not have an ending closing brace. Text “{3}â€"},"ngOptions":{"iexp":"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}"},"$rootScope":{"inprog":"{0} already in progress","infdig":"{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}"},"$compile":{"noident":"Cannot bind to controller without identifier for directive '{0}'.","selmulti":"Binding to the 'multiple' attribute is not supported. Element: {0}","nodomevents":"Interpolations for HTML DOM event attributes are disallowed. Please use the ng- versions (such as ng-click instead of onclick) instead.","ctreq":"Controller '{0}', required by directive '{1}', can't be found!","nonassign":"Expression '{0}' used with directive '{1}' is non-assignable!","tplrt":"Template for directive '{0}' must have exactly one root element. {1}","iscp":"Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}","baddir":"Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces","noctrl":"Cannot bind to controller without directive '{0}'s controller.","multidir":"Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}","tpload":"Failed to load template: {0} (HTTP status: {1} {2})","uterdir":"Unterminated attribute, found '{0}' but no matching '{1}' found."},"$resource":{"badargs":"Expected up to 4 arguments [params, data, success, error], got {0} arguments","badmember":"Dotted member path \"@{0}\" is invalid.","badname":"hasOwnProperty is not a valid parameter name.","badcfg":"Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})"},"$route":{"norout":"Tried updating route when with no current route"},"$sanitize":{"badparse":"The sanitizer was unable to parse the following block of html: {0}"}}} \ No newline at end of file diff --git a/common/resources/lib/angular/treeview/LICENSE b/common/resources/lib/angular/treeview/LICENSE new file mode 100644 index 0000000..514acd3 --- /dev/null +++ b/common/resources/lib/angular/treeview/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Steve + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/common/resources/lib/angular/treeview/README.md b/common/resources/lib/angular/treeview/README.md new file mode 100644 index 0000000..31c824f --- /dev/null +++ b/common/resources/lib/angular/treeview/README.md @@ -0,0 +1,122 @@ +Angular Treeview +================ + +Pure [AngularJS](https://www.angularjs.org) based tree menu directive. + +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/preview.png)](https://jsfiddle.net/eu81273/8LWUc/) + +## Installation + +Copy the script and css into your project and add a script and link tag to your page. + +```html + + +``` + +Add a dependency to your application module. + +```javascript +angular.module('myApp', ['angularTreeview']); +``` + +Add a tree to your application. See [Usage](#usage). + +## Usage + +Attributes of angular treeview are below. + +- angular-treeview: the treeview directive. +- tree-id : each tree's unique id. +- tree-model : the tree model on $scope. +- node-id : each node's id. +- node-label : each node's label. +- node-children: each node's children. + +Here is a simple example. + + +```html +
+
+``` + +Example model: + +```javascript +$scope.treedata = +[ + { "label" : "User", "id" : "role1", "children" : [ + { "label" : "subUser1", "id" : "role11", "children" : [] }, + { "label" : "subUser2", "id" : "role12", "children" : [ + { "label" : "subUser2-1", "id" : "role121", "children" : [ + { "label" : "subUser2-1-1", "id" : "role1211", "children" : [] }, + { "label" : "subUser2-1-2", "id" : "role1212", "children" : [] } + ]} + ]} + ]}, + { "label" : "Admin", "id" : "role2", "children" : [] }, + { "label" : "Guest", "id" : "role3", "children" : [] } +]; +``` + +## Selection + +If tree node is selected, then that selected tree node is saved to $scope."TREE ID".currentNode. By using $watch, the controller can recognize the tree selection. + + +```javascript +$scope.$watch( 'abc.currentNode', function( newObj, oldObj ) { + if( $scope.abc && angular.isObject($scope.abc.currentNode) ) { + console.log( 'Node Selected!!' ); + console.log( $scope.abc.currentNode ); + } +}, false); +``` + +## Examples + +#### Basic example +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle01.png)](https://jsfiddle.net/eu81273/8LWUc/) + +[jsFiddle - http://jsfiddle.net/eu81273/8LWUc/](https://jsfiddle.net/eu81273/8LWUc/) + +#### Multiple treeview example +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle02.png)](https://jsfiddle.net/eu81273/b9Pnw/) + +[jsFiddle - http://jsfiddle.net/eu81273/b9Pnw/](https://jsfiddle.net/eu81273/b9Pnw/) + +## Browser Compatibility + +Same with AngularJS. Safari, Chrome, Firefox, Opera, IE8, IE9 and mobile browsers (Android, Chrome Mobile, iOS Safari). + +## Changelogs + +#### version 0.1.6 +- Fixed the bug that 'null' string appears before each 'div' generated. (Thanks to Iaac) + +#### version 0.1.5 +- support multiple treeview. (Thanks to Axel Pesme) + +#### version 0.1.4 +- prevented memory leaks. + +#### version 0.1.3 +- removed unnecessary codes. + +#### version 0.1.2 +- removed some jQuery dependency. (Issue #2) + +## License + +The MIT License. + +Copyright â“’ 2013 AHN JAE-HA. + +See [LICENSE](https://github.com/eu81273/angular.treeview/blob/master/LICENSE) diff --git a/common/resources/lib/angular/treeview/angular.treeview.js b/common/resources/lib/angular/treeview/angular.treeview.js new file mode 100755 index 0000000..0e6512a --- /dev/null +++ b/common/resources/lib/angular/treeview/angular.treeview.js @@ -0,0 +1,97 @@ +/* + @license Angular Treeview version 0.1.6 + â“’ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview + License: MIT + + + [TREE attribute] + angular-treeview: the treeview directive + tree-id : each tree's unique id. + tree-model : the tree model on $scope. + node-id : each node's id + node-label : each node's label + node-children: each node's children + +
+
+*/ + +(function ( angular ) { + 'use strict'; + + angular.module( 'angularTreeview', [] ).directive( 'treeModel', ['$compile', function( $compile ) { + return { + restrict: 'A', + link: function ( scope, element, attrs ) { + //tree id + var treeId = attrs.treeId; + + //tree model + var treeModel = attrs.treeModel; + + //node id + var nodeId = attrs.nodeId || 'id'; + + //node label + var nodeLabel = attrs.nodeLabel || 'label'; + + //children + var nodeChildren = attrs.nodeChildren || 'children'; + + //tree template + + var template = + '
    ' + + '
  • ' + + '' + + '{{node.' + nodeLabel + '}}' + + '
    ' + + '
  • ' + + '
'; + + + //check tree id, tree model + if( treeId && treeModel ) { + //root node + if( attrs.angularTreeview ) { + + //create tree object if not exists + scope[treeId] = scope[treeId] || {}; + + //if node head clicks, + scope[treeId].selectNodeHead = scope[treeId].selectNodeHead || function( selectedNode ){ + + //Collapse or Expand + selectedNode.collapsed = !selectedNode.collapsed; + scope[treeId].selectNodeLabel(selectedNode); + }; + + //if node label clicks, + scope[treeId].selectNodeLabel = scope[treeId].selectNodeLabel || function( selectedNode ){ + + //remove highlight from previous node + if( scope[treeId].currentNode && scope[treeId].currentNode.selected ) { + scope[treeId].currentNode.selected = undefined; + } + + //set highlight to selected node + selectedNode.selected = 'selected'; + + //set currentNode + scope[treeId].currentNode = selectedNode; + }; + } + + //Rendering template. + element.html('').append( $compile( template )( scope ) ); + } + } + }; + }]); +})( angular ); diff --git a/common/resources/lib/angular/treeview/angular.treeview.min.js b/common/resources/lib/angular/treeview/angular.treeview.min.js new file mode 100644 index 0000000..e02a85b --- /dev/null +++ b/common/resources/lib/angular/treeview/angular.treeview.min.js @@ -0,0 +1,9 @@ +/* + @license Angular Treeview version 0.1.6 + â“’ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview + License: MIT +*/ + +(function(f){f.module("angularTreeview",[]).directive("treeModel",function($compile){return{restrict:"A",link:function(b,h,c){var a=c.treeId,g=c.treeModel,e=c.nodeLabel||"label",d=c.nodeChildren||"children",e='
  • {{node.'+e+'}}
    Nn{1`ISV`@iy0WK`GA@ZGfr^Q{|ywBDshb{3C>R|DNig)We7;j%q!9Ja}7}_ zGuAWJGc+*xQnV1Ls?5{HF~q_@`N#kN_7dyg6#nVwKYT?o*@Af$gZ7S1+u2q#x?~?q zWAL1Hk@vurInfPW7a8i#vM|J*wY@EVsIb=8CPGJBozth8;cIT&&89cu6C_TArOaOV zsvtv+;X@XiEBmJXy4KzYB-k?2jTIY$jW*L74G){)!Z!pj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9i zsh**M!Iz?iKvf-{E{-7<{>eZ7|F?IQSgoKb(OSIY?h|_>w`qr4ANFiLy32t})Zu7= z$%149#%*se+OX`q^5_4-bzBB+<)RU~Vay#YJ9r(+80Bniz2q)4Y>3~eajfm);Z`fQ zGv@;s*<}nR)`;C@*sy;CPHH$418>P78iIN|1ZhV;4m`+Ct6UXE{ZK({e?y85}Sb4q9e0F?+}6aWAK literal 0 HcmV?d00001 diff --git a/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js b/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js new file mode 100644 index 0000000..bcca1cd --- /dev/null +++ b/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js @@ -0,0 +1,4116 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.11.0 - 2014-05-01 + * License: MIT + */ +angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); +angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); +angular.module('ui.bootstrap.transition', []) + +/** + * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. + * @param {DOMElement} element The DOMElement that will be animated. + * @param {string|object|function} trigger The thing that will cause the transition to start: + * - As a string, it represents the css class to be added to the element. + * - As an object, it represents a hash of style attributes to be applied to the element. + * - As a function, it represents a function to be called that will cause the transition to occur. + * @return {Promise} A promise that is resolved when the transition finishes. + */ +.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { + + var $transition = function(element, trigger, options) { + options = options || {}; + var deferred = $q.defer(); + var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName']; + + var transitionEndHandler = function(event) { + $rootScope.$apply(function() { + element.unbind(endEventName, transitionEndHandler); + deferred.resolve(element); + }); + }; + + if (endEventName) { + element.bind(endEventName, transitionEndHandler); + } + + // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur + $timeout(function() { + if ( angular.isString(trigger) ) { + element.addClass(trigger); + } else if ( angular.isFunction(trigger) ) { + trigger(element); + } else if ( angular.isObject(trigger) ) { + element.css(trigger); + } + //If browser does not support transitions, instantly resolve + if ( !endEventName ) { + deferred.resolve(element); + } + }); + + // Add our custom cancel function to the promise that is returned + // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, + // i.e. it will therefore never raise a transitionEnd event for that transition + deferred.promise.cancel = function() { + if ( endEventName ) { + element.unbind(endEventName, transitionEndHandler); + } + deferred.reject('Transition cancelled'); + }; + + return deferred.promise; + }; + + // Work out the name of the transitionEnd event + var transElement = document.createElement('trans'); + var transitionEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' + }; + var animationEndEventNames = { + 'WebkitTransition': 'webkitAnimationEnd', + 'MozTransition': 'animationend', + 'OTransition': 'oAnimationEnd', + 'transition': 'animationend' + }; + function findEndEventName(endEventNames) { + for (var name in endEventNames){ + if (transElement.style[name] !== undefined) { + return endEventNames[name]; + } + } + } + $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); + $transition.animationEndEventName = findEndEventName(animationEndEventNames); + return $transition; +}]); + +angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) + + .directive('collapse', ['$transition', function ($transition) { + + return { + link: function (scope, element, attrs) { + + var initialAnimSkip = true; + var currentTransition; + + function doTransition(change) { + var newTransition = $transition(element, change); + if (currentTransition) { + currentTransition.cancel(); + } + currentTransition = newTransition; + newTransition.then(newTransitionDone, newTransitionDone); + return newTransition; + + function newTransitionDone() { + // Make sure it's this transition, otherwise, leave it alone. + if (currentTransition === newTransition) { + currentTransition = undefined; + } + } + } + + function expand() { + if (initialAnimSkip) { + initialAnimSkip = false; + expandDone(); + } else { + element.removeClass('collapse').addClass('collapsing'); + doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); + } + } + + function expandDone() { + element.removeClass('collapsing'); + element.addClass('collapse in'); + element.css({height: 'auto'}); + } + + function collapse() { + if (initialAnimSkip) { + initialAnimSkip = false; + collapseDone(); + element.css({height: 0}); + } else { + // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value + element.css({ height: element[0].scrollHeight + 'px' }); + //trigger reflow so a browser realizes that height was updated from auto to a specific value + var x = element[0].offsetWidth; + + element.removeClass('collapse in').addClass('collapsing'); + + doTransition({ height: 0 }).then(collapseDone); + } + } + + function collapseDone() { + element.removeClass('collapsing'); + element.addClass('collapse'); + } + + scope.$watch(attrs.collapse, function (shouldCollapse) { + if (shouldCollapse) { + collapse(); + } else { + expand(); + } + }); + } + }; + }]); + +angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) + +.constant('accordionConfig', { + closeOthers: true +}) + +.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { + + // This array keeps track of the accordion groups + this.groups = []; + + // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to + this.closeOthers = function(openGroup) { + var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; + if ( closeOthers ) { + angular.forEach(this.groups, function (group) { + if ( group !== openGroup ) { + group.isOpen = false; + } + }); + } + }; + + // This is called from the accordion-group directive to add itself to the accordion + this.addGroup = function(groupScope) { + var that = this; + this.groups.push(groupScope); + + groupScope.$on('$destroy', function (event) { + that.removeGroup(groupScope); + }); + }; + + // This is called from the accordion-group directive when to remove itself + this.removeGroup = function(group) { + var index = this.groups.indexOf(group); + if ( index !== -1 ) { + this.groups.splice(index, 1); + } + }; + +}]) + +// The accordion directive simply sets up the directive controller +// and adds an accordion CSS class to itself element. +.directive('accordion', function () { + return { + restrict:'EA', + controller:'AccordionController', + transclude: true, + replace: false, + templateUrl: 'template/accordion/accordion.html' + }; +}) + +// The accordion-group directive indicates a block of html that will expand and collapse in an accordion +.directive('accordionGroup', function() { + return { + require:'^accordion', // We need this directive to be inside an accordion + restrict:'EA', + transclude:true, // It transcludes the contents of the directive into the template + replace: true, // The element containing the directive will be replaced with the template + templateUrl:'template/accordion/accordion-group.html', + scope: { + heading: '@', // Interpolate the heading attribute onto this scope + isOpen: '=?', + isDisabled: '=?' + }, + controller: function() { + this.setHeading = function(element) { + this.heading = element; + }; + }, + link: function(scope, element, attrs, accordionCtrl) { + accordionCtrl.addGroup(scope); + + scope.$watch('isOpen', function(value) { + if ( value ) { + accordionCtrl.closeOthers(scope); + } + }); + + scope.toggleOpen = function() { + if ( !scope.isDisabled ) { + scope.isOpen = !scope.isOpen; + } + }; + } + }; +}) + +// Use accordion-heading below an accordion-group to provide a heading containing HTML +// +// Heading containing HTML - +// +.directive('accordionHeading', function() { + return { + restrict: 'EA', + transclude: true, // Grab the contents to be used as the heading + template: '', // In effect remove this element! + replace: true, + require: '^accordionGroup', + link: function(scope, element, attr, accordionGroupCtrl, transclude) { + // Pass the heading to the accordion-group controller + // so that it can be transcluded into the right place in the template + // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] + accordionGroupCtrl.setHeading(transclude(scope, function() {})); + } + }; +}) + +// Use in the accordion-group template to indicate where you want the heading to be transcluded +// You must provide the property on the accordion-group controller that will hold the transcluded element +//
    +// +// ... +//
    +.directive('accordionTransclude', function() { + return { + require: '^accordionGroup', + link: function(scope, element, attr, controller) { + scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { + if ( heading ) { + element.html(''); + element.append(heading); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.alert', []) + +.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { + $scope.closeable = 'close' in $attrs; +}]) + +.directive('alert', function () { + return { + restrict:'EA', + controller:'AlertController', + templateUrl:'template/alert/alert.html', + transclude:true, + replace:true, + scope: { + type: '@', + close: '&' + } + }; +}); + +angular.module('ui.bootstrap.bindHtml', []) + + .directive('bindHtmlUnsafe', function () { + return function (scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); + scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; + }); +angular.module('ui.bootstrap.buttons', []) + +.constant('buttonConfig', { + activeClass: 'active', + toggleEvent: 'click' +}) + +.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { + this.activeClass = buttonConfig.activeClass || 'active'; + this.toggleEvent = buttonConfig.toggleEvent || 'click'; +}]) + +.directive('btnRadio', function () { + return { + require: ['btnRadio', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + var isActive = element.hasClass(buttonsCtrl.activeClass); + + if (!isActive || angular.isDefined(attrs.uncheckable)) { + scope.$apply(function () { + ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); + ngModelCtrl.$render(); + }); + } + }); + } + }; +}) + +.directive('btnCheckbox', function () { + return { + require: ['btnCheckbox', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + function getTrueValue() { + return getCheckboxValue(attrs.btnCheckboxTrue, true); + } + + function getFalseValue() { + return getCheckboxValue(attrs.btnCheckboxFalse, false); + } + + function getCheckboxValue(attributeValue, defaultValue) { + var val = scope.$eval(attributeValue); + return angular.isDefined(val) ? val : defaultValue; + } + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + scope.$apply(function () { + ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); + ngModelCtrl.$render(); + }); + }); + } + }; +}); + +/** +* @ngdoc overview +* @name ui.bootstrap.carousel +* +* @description +* AngularJS version of an image carousel. +* +*/ +angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) +.controller('CarouselController', ['$scope', '$timeout', '$transition', function ($scope, $timeout, $transition) { + var self = this, + slides = self.slides = $scope.slides = [], + currentIndex = -1, + currentTimeout, isPlaying; + self.currentSlide = null; + + var destroyed = false; + /* direction: "prev" or "next" */ + self.select = $scope.select = function(nextSlide, direction) { + var nextIndex = slides.indexOf(nextSlide); + //Decide direction if it's not given + if (direction === undefined) { + direction = nextIndex > currentIndex ? 'next' : 'prev'; + } + if (nextSlide && nextSlide !== self.currentSlide) { + if ($scope.$currentTransition) { + $scope.$currentTransition.cancel(); + //Timeout so ng-class in template has time to fix classes for finished slide + $timeout(goNext); + } else { + goNext(); + } + } + function goNext() { + // Scope has been destroyed, stop here. + if (destroyed) { return; } + //If we have a slide to transition from and we have a transition type and we're allowed, go + if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { + //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime + nextSlide.$element.addClass(direction); + var reflow = nextSlide.$element[0].offsetWidth; //force reflow + + //Set all other slides to stop doing their stuff for the new transition + angular.forEach(slides, function(slide) { + angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); + }); + angular.extend(nextSlide, {direction: direction, active: true, entering: true}); + angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); + + $scope.$currentTransition = $transition(nextSlide.$element, {}); + //We have to create new pointers inside a closure since next & current will change + (function(next,current) { + $scope.$currentTransition.then( + function(){ transitionDone(next, current); }, + function(){ transitionDone(next, current); } + ); + }(nextSlide, self.currentSlide)); + } else { + transitionDone(nextSlide, self.currentSlide); + } + self.currentSlide = nextSlide; + currentIndex = nextIndex; + //every time you change slides, reset the timer + restartTimer(); + } + function transitionDone(next, current) { + angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); + angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); + $scope.$currentTransition = null; + } + }; + $scope.$on('$destroy', function () { + destroyed = true; + }); + + /* Allow outside people to call indexOf on slides array */ + self.indexOfSlide = function(slide) { + return slides.indexOf(slide); + }; + + $scope.next = function() { + var newIndex = (currentIndex + 1) % slides.length; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'next'); + } + }; + + $scope.prev = function() { + var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'prev'); + } + }; + + $scope.isActive = function(slide) { + return self.currentSlide === slide; + }; + + $scope.$watch('interval', restartTimer); + $scope.$on('$destroy', resetTimer); + + function restartTimer() { + resetTimer(); + var interval = +$scope.interval; + if (!isNaN(interval) && interval>=0) { + currentTimeout = $timeout(timerFn, interval); + } + } + + function resetTimer() { + if (currentTimeout) { + $timeout.cancel(currentTimeout); + currentTimeout = null; + } + } + + function timerFn() { + if (isPlaying) { + $scope.next(); + restartTimer(); + } else { + $scope.pause(); + } + } + + $scope.play = function() { + if (!isPlaying) { + isPlaying = true; + restartTimer(); + } + }; + $scope.pause = function() { + if (!$scope.noPause) { + isPlaying = false; + resetTimer(); + } + }; + + self.addSlide = function(slide, element) { + slide.$element = element; + slides.push(slide); + //if this is the first slide or the slide is set to active, select it + if(slides.length === 1 || slide.active) { + self.select(slides[slides.length-1]); + if (slides.length == 1) { + $scope.play(); + } + } else { + slide.active = false; + } + }; + + self.removeSlide = function(slide) { + //get the index of the slide inside the carousel + var index = slides.indexOf(slide); + slides.splice(index, 1); + if (slides.length > 0 && slide.active) { + if (index >= slides.length) { + self.select(slides[index-1]); + } else { + self.select(slides[index]); + } + } else if (currentIndex > index) { + currentIndex--; + } + }; + +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:carousel + * @restrict EA + * + * @description + * Carousel is the outer container for a set of image 'slides' to showcase. + * + * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. + * @param {boolean=} noTransition Whether to disable transitions on the carousel. + * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). + * + * @example + + + + + + + + + + + + + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + + + */ +.directive('carousel', [function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + controller: 'CarouselController', + require: 'carousel', + templateUrl: 'template/carousel/carousel.html', + scope: { + interval: '=', + noTransition: '=', + noPause: '=' + } + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:slide + * @restrict EA + * + * @description + * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. + * + * @param {boolean=} active Model binding, whether or not this slide is currently active. + * + * @example + + +
    + + + + + + + Interval, in milliseconds: +
    Enter a negative number to stop the interval. +
    +
    + +function CarouselDemoCtrl($scope) { + $scope.myInterval = 5000; +} + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
    +*/ + +.directive('slide', function() { + return { + require: '^carousel', + restrict: 'EA', + transclude: true, + replace: true, + templateUrl: 'template/carousel/slide.html', + scope: { + active: '=?' + }, + link: function (scope, element, attrs, carouselCtrl) { + carouselCtrl.addSlide(scope, element); + //when the scope is destroyed then remove the slide from the current slides array + scope.$on('$destroy', function() { + carouselCtrl.removeSlide(scope); + }); + + scope.$watch('active', function(active) { + if (active) { + carouselCtrl.select(scope); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.dateparser', []) + +.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) { + + this.parsers = {}; + + var formatCodeToRegex = { + 'yyyy': { + regex: '\\d{4}', + apply: function(value) { this.year = +value; } + }, + 'yy': { + regex: '\\d{2}', + apply: function(value) { this.year = +value + 2000; } + }, + 'y': { + regex: '\\d{1,4}', + apply: function(value) { this.year = +value; } + }, + 'MMMM': { + regex: $locale.DATETIME_FORMATS.MONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); } + }, + 'MMM': { + regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); } + }, + 'MM': { + regex: '0[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'M': { + regex: '[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'dd': { + regex: '[0-2][0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'd': { + regex: '[1-2]?[0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'EEEE': { + regex: $locale.DATETIME_FORMATS.DAY.join('|') + }, + 'EEE': { + regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|') + } + }; + + this.createParser = function(format) { + var map = [], regex = format.split(''); + + angular.forEach(formatCodeToRegex, function(data, code) { + var index = format.indexOf(code); + + if (index > -1) { + format = format.split(''); + + regex[index] = '(' + data.regex + ')'; + format[index] = '$'; // Custom symbol to define consumed part of format + for (var i = index + 1, n = index + code.length; i < n; i++) { + regex[i] = ''; + format[i] = '$'; + } + format = format.join(''); + + map.push({ index: index, apply: data.apply }); + } + }); + + return { + regex: new RegExp('^' + regex.join('') + '$'), + map: orderByFilter(map, 'index') + }; + }; + + this.parse = function(input, format) { + if ( !angular.isString(input) ) { + return input; + } + + format = $locale.DATETIME_FORMATS[format] || format; + + if ( !this.parsers[format] ) { + this.parsers[format] = this.createParser(format); + } + + var parser = this.parsers[format], + regex = parser.regex, + map = parser.map, + results = input.match(regex); + + if ( results && results.length ) { + var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt; + + for( var i = 1, n = results.length; i < n; i++ ) { + var mapper = map[i-1]; + if ( mapper.apply ) { + mapper.apply.call(fields, results[i]); + } + } + + if ( isValid(fields.year, fields.month, fields.date) ) { + dt = new Date( fields.year, fields.month, fields.date, fields.hours); + } + + return dt; + } + }; + + // Check if date is valid for specific month (and year for February). + // Month: 0 = Jan, 1 = Feb, etc + function isValid(year, month, date) { + if ( month === 1 && date > 28) { + return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + } + + if ( month === 3 || month === 5 || month === 8 || month === 10) { + return date < 31; + } + + return true; + } +}]); + +angular.module('ui.bootstrap.position', []) + +/** + * A set of utility methods that can be use to retrieve position of DOM elements. + * It is meant to be used where we need to absolute-position DOM elements in + * relation to other, existing elements (this is the case for tooltips, popovers, + * typeahead suggestions etc.). + */ + .factory('$position', ['$document', '$window', function ($document, $window) { + + function getStyle(el, cssprop) { + if (el.currentStyle) { //IE + return el.currentStyle[cssprop]; + } else if ($window.getComputedStyle) { + return $window.getComputedStyle(el)[cssprop]; + } + // finally try and get inline style + return el.style[cssprop]; + } + + /** + * Checks if a given element is statically positioned + * @param element - raw DOM element + */ + function isStaticPositioned(element) { + return (getStyle(element, 'position') || 'static' ) === 'static'; + } + + /** + * returns the closest, non-statically positioned parentOffset of a given element + * @param element + */ + var parentOffsetEl = function (element) { + var docDomEl = $document[0]; + var offsetParent = element.offsetParent || docDomEl; + while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docDomEl; + }; + + return { + /** + * Provides read-only equivalent of jQuery's position function: + * http://api.jquery.com/position/ + */ + position: function (element) { + var elBCR = this.offset(element); + var offsetParentBCR = { top: 0, left: 0 }; + var offsetParentEl = parentOffsetEl(element[0]); + if (offsetParentEl != $document[0]) { + offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; + offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; + } + + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: elBCR.top - offsetParentBCR.top, + left: elBCR.left - offsetParentBCR.left + }; + }, + + /** + * Provides read-only equivalent of jQuery's offset function: + * http://api.jquery.com/offset/ + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * Provides coordinates for the targetEl in relation to hostEl + */ + positionElements: function (hostEl, targetEl, positionStr, appendToBody) { + + var positionStrParts = positionStr.split('-'); + var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center'; + + var hostElPos, + targetElWidth, + targetElHeight, + targetElPos; + + hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl); + + targetElWidth = targetEl.prop('offsetWidth'); + targetElHeight = targetEl.prop('offsetHeight'); + + var shiftWidth = { + center: function () { + return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2; + }, + left: function () { + return hostElPos.left; + }, + right: function () { + return hostElPos.left + hostElPos.width; + } + }; + + var shiftHeight = { + center: function () { + return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2; + }, + top: function () { + return hostElPos.top; + }, + bottom: function () { + return hostElPos.top + hostElPos.height; + } + }; + + switch (pos0) { + case 'right': + targetElPos = { + top: shiftHeight[pos1](), + left: shiftWidth[pos0]() + }; + break; + case 'left': + targetElPos = { + top: shiftHeight[pos1](), + left: hostElPos.left - targetElWidth + }; + break; + case 'bottom': + targetElPos = { + top: shiftHeight[pos0](), + left: shiftWidth[pos1]() + }; + break; + default: + targetElPos = { + top: hostElPos.top - targetElHeight, + left: shiftWidth[pos1]() + }; + break; + } + + return targetElPos; + } + }; + }]); + +angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position']) + +.constant('datepickerConfig', { + formatDay: 'dd', + formatMonth: 'MMMM', + formatYear: 'yyyy', + formatDayHeader: 'EEE', + formatDayTitle: 'MMMM yyyy', + formatMonthTitle: 'yyyy', + datepickerMode: 'day', + minMode: 'day', + maxMode: 'year', + showWeeks: true, + startingDay: 0, + yearRange: 20, + minDate: null, + maxDate: null +}) + +.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl; + + // Modes chain + this.modes = ['day', 'month', 'year']; + + // Configuration attributes + angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', + 'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) { + self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key]; + }); + + // Watchable attributes + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( $attrs[key] ) { + $scope.$parent.$watch($parse($attrs[key]), function(value) { + self[key] = value ? new Date(value) : null; + self.refreshView(); + }); + } else { + self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null; + } + }); + + $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode; + $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000); + this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date(); + + $scope.isActive = function(dateObject) { + if (self.compare(dateObject.date, self.activeDate) === 0) { + $scope.activeDateId = dateObject.uid; + return true; + } + return false; + }; + + this.init = function( ngModelCtrl_ ) { + ngModelCtrl = ngModelCtrl_; + + ngModelCtrl.$render = function() { + self.render(); + }; + }; + + this.render = function() { + if ( ngModelCtrl.$modelValue ) { + var date = new Date( ngModelCtrl.$modelValue ), + isValid = !isNaN(date); + + if ( isValid ) { + this.activeDate = date; + } else { + $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } + ngModelCtrl.$setValidity('date', isValid); + } + this.refreshView(); + }; + + this.refreshView = function() { + if ( this.element ) { + this._refreshView(); + + var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date))); + } + }; + + this.createDateObject = function(date, format) { + var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + return { + date: date, + label: dateFilter(date, format), + selected: model && this.compare(date, model) === 0, + disabled: this.isDisabled(date), + current: this.compare(date, new Date()) === 0 + }; + }; + + this.isDisabled = function( date ) { + return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode}))); + }; + + // Split array into smaller arrays + this.split = function(arr, size) { + var arrays = []; + while (arr.length > 0) { + arrays.push(arr.splice(0, size)); + } + return arrays; + }; + + $scope.select = function( date ) { + if ( $scope.datepickerMode === self.minMode ) { + var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); + dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); + ngModelCtrl.$setViewValue( dt ); + ngModelCtrl.$render(); + } else { + self.activeDate = date; + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ]; + } + }; + + $scope.move = function( direction ) { + var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), + month = self.activeDate.getMonth() + direction * (self.step.months || 0); + self.activeDate.setFullYear(year, month, 1); + self.refreshView(); + }; + + $scope.toggleMode = function( direction ) { + direction = direction || 1; + + if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) { + return; + } + + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ]; + }; + + // Key event mapper + $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' }; + + var focusElement = function() { + $timeout(function() { + self.element[0].focus(); + }, 0 , false); + }; + + // Listen for focus requests from popup directive + $scope.$on('datepicker.focus', focusElement); + + $scope.keydown = function( evt ) { + var key = $scope.keys[evt.which]; + + if ( !key || evt.shiftKey || evt.altKey ) { + return; + } + + evt.preventDefault(); + evt.stopPropagation(); + + if (key === 'enter' || key === 'space') { + if ( self.isDisabled(self.activeDate)) { + return; // do nothing + } + $scope.select(self.activeDate); + focusElement(); + } else if (evt.ctrlKey && (key === 'up' || key === 'down')) { + $scope.toggleMode(key === 'up' ? 1 : -1); + focusElement(); + } else { + self.handleKeyDown(key, evt); + self.refreshView(); + } + }; +}]) + +.directive( 'datepicker', function () { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/datepicker.html', + scope: { + datepickerMode: '=?', + dateDisabled: '&' + }, + require: ['datepicker', '?^ngModel'], + controller: 'DatepickerController', + link: function(scope, element, attrs, ctrls) { + var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + datepickerCtrl.init( ngModelCtrl ); + } + } + }; +}) + +.directive('daypicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/day.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + scope.showWeeks = ctrl.showWeeks; + + ctrl.step = { months: 1 }; + ctrl.element = element; + + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function getDaysInMonth( year, month ) { + return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month]; + } + + function getDates(startDate, n) { + var dates = new Array(n), current = new Date(startDate), i = 0; + current.setHours(12); // Prevent repeated dates because of timezone bug + while ( i < n ) { + dates[i++] = new Date(current); + current.setDate( current.getDate() + 1 ); + } + return dates; + } + + ctrl._refreshView = function() { + var year = ctrl.activeDate.getFullYear(), + month = ctrl.activeDate.getMonth(), + firstDayOfMonth = new Date(year, month, 1), + difference = ctrl.startingDay - firstDayOfMonth.getDay(), + numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, + firstDate = new Date(firstDayOfMonth); + + if ( numDisplayedFromPreviousMonth > 0 ) { + firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); + } + + // 42 is the number of days on a six-month calendar + var days = getDates(firstDate, 42); + for (var i = 0; i < 42; i ++) { + days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), { + secondary: days[i].getMonth() !== month, + uid: scope.uniqueId + '-' + i + }); + } + + scope.labels = new Array(7); + for (var j = 0; j < 7; j++) { + scope.labels[j] = { + abbr: dateFilter(days[j].date, ctrl.formatDayHeader), + full: dateFilter(days[j].date, 'EEEE') + }; + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle); + scope.rows = ctrl.split(days, 7); + + if ( scope.showWeeks ) { + scope.weekNumbers = []; + var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ), + numWeeks = scope.rows.length; + while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {} + } + }; + + ctrl.compare = function(date1, date2) { + return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); + }; + + function getISO8601WeekNumber(date) { + var checkDate = new Date(date); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + } + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getDate(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 7; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 7; + } else if (key === 'pageup' || key === 'pagedown') { + var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setMonth(month, 1); + date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date); + } else if (key === 'home') { + date = 1; + } else if (key === 'end') { + date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()); + } + ctrl.activeDate.setDate(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('monthpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/month.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + ctrl.step = { years: 1 }; + ctrl.element = element; + + ctrl._refreshView = function() { + var months = new Array(12), + year = ctrl.activeDate.getFullYear(); + + for ( var i = 0; i < 12; i++ ) { + months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle); + scope.rows = ctrl.split(months, 3); + }; + + ctrl.compare = function(date1, date2) { + return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getMonth(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 3; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 3; + } else if (key === 'pageup' || key === 'pagedown') { + var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setFullYear(year); + } else if (key === 'home') { + date = 0; + } else if (key === 'end') { + date = 11; + } + ctrl.activeDate.setMonth(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('yearpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/year.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + var range = ctrl.yearRange; + + ctrl.step = { years: range }; + ctrl.element = element; + + function getStartingYear( year ) { + return parseInt((year - 1) / range, 10) * range + 1; + } + + ctrl._refreshView = function() { + var years = new Array(range); + + for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) { + years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = [years[0].label, years[range - 1].label].join(' - '); + scope.rows = ctrl.split(years, 5); + }; + + ctrl.compare = function(date1, date2) { + return date1.getFullYear() - date2.getFullYear(); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getFullYear(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 5; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 5; + } else if (key === 'pageup' || key === 'pagedown') { + date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years; + } else if (key === 'home') { + date = getStartingYear( ctrl.activeDate.getFullYear() ); + } else if (key === 'end') { + date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1; + } + ctrl.activeDate.setFullYear(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.constant('datepickerPopupConfig', { + datepickerPopup: 'yyyy-MM-dd', + currentText: 'Today', + clearText: 'Clear', + closeText: 'Done', + closeOnDateSelection: true, + appendToBody: false, + showButtonBar: true +}) + +.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', +function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) { + return { + restrict: 'EA', + require: 'ngModel', + scope: { + isOpen: '=?', + currentText: '@', + clearText: '@', + closeText: '@', + dateDisabled: '&' + }, + link: function(scope, element, attrs, ngModel) { + var dateFormat, + closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, + appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; + + scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + + scope.getText = function( key ) { + return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; + }; + + attrs.$observe('datepickerPopup', function(value) { + dateFormat = value || datepickerPopupConfig.datepickerPopup; + ngModel.$render(); + }); + + // popup element used to display calendar + var popupEl = angular.element('
    '); + popupEl.attr({ + 'ng-model': 'date', + 'ng-change': 'dateSelection()' + }); + + function cameltoDash( string ){ + return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); + } + + // datepicker element + var datepickerEl = angular.element(popupEl.children()[0]); + if ( attrs.datepickerOptions ) { + angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) { + datepickerEl.attr( cameltoDash(option), value ); + }); + } + + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( attrs[key] ) { + scope.$parent.$watch($parse(attrs[key]), function(value){ + scope[key] = value; + }); + datepickerEl.attr(cameltoDash(key), key); + } + }); + if (attrs.dateDisabled) { + datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })'); + } + + function parseDate(viewValue) { + if (!viewValue) { + ngModel.$setValidity('date', true); + return null; + } else if (angular.isDate(viewValue) && !isNaN(viewValue)) { + ngModel.$setValidity('date', true); + return viewValue; + } else if (angular.isString(viewValue)) { + var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue); + if (isNaN(date)) { + ngModel.$setValidity('date', false); + return undefined; + } else { + ngModel.$setValidity('date', true); + return date; + } + } else { + ngModel.$setValidity('date', false); + return undefined; + } + } + ngModel.$parsers.unshift(parseDate); + + // Inner change + scope.dateSelection = function(dt) { + if (angular.isDefined(dt)) { + scope.date = dt; + } + ngModel.$setViewValue(scope.date); + ngModel.$render(); + + if ( closeOnDateSelection ) { + scope.isOpen = false; + element[0].focus(); + } + }; + + element.bind('input change keyup', function() { + scope.$apply(function() { + scope.date = ngModel.$modelValue; + }); + }); + + // Outter change + ngModel.$render = function() { + var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; + element.val(date); + scope.date = parseDate( ngModel.$modelValue ); + }; + + var documentClickBind = function(event) { + if (scope.isOpen && event.target !== element[0]) { + scope.$apply(function() { + scope.isOpen = false; + }); + } + }; + + var keydown = function(evt, noApply) { + scope.keydown(evt); + }; + element.bind('keydown', keydown); + + scope.keydown = function(evt) { + if (evt.which === 27) { + evt.preventDefault(); + evt.stopPropagation(); + scope.close(); + } else if (evt.which === 40 && !scope.isOpen) { + scope.isOpen = true; + } + }; + + scope.$watch('isOpen', function(value) { + if (value) { + scope.$broadcast('datepicker.focus'); + scope.position = appendToBody ? $position.offset(element) : $position.position(element); + scope.position.top = scope.position.top + element.prop('offsetHeight'); + + $document.bind('click', documentClickBind); + } else { + $document.unbind('click', documentClickBind); + } + }); + + scope.select = function( date ) { + if (date === 'today') { + var today = new Date(); + if (angular.isDate(ngModel.$modelValue)) { + date = new Date(ngModel.$modelValue); + date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate()); + } else { + date = new Date(today.setHours(0, 0, 0, 0)); + } + } + scope.dateSelection( date ); + }; + + scope.close = function() { + scope.isOpen = false; + element[0].focus(); + }; + + var $popup = $compile(popupEl)(scope); + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + + scope.$on('$destroy', function() { + $popup.remove(); + element.unbind('keydown', keydown); + $document.unbind('click', documentClickBind); + }); + } + }; +}]) + +.directive('datepickerPopupWrap', function() { + return { + restrict:'EA', + replace: true, + transclude: true, + templateUrl: 'template/datepicker/popup.html', + link:function (scope, element, attrs) { + element.bind('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); + } + }; +}); + +angular.module('ui.bootstrap.dropdown', []) + +.constant('dropdownConfig', { + openClass: 'open' +}) + +.service('dropdownService', ['$document', function($document) { + var openScope = null; + + this.open = function( dropdownScope ) { + if ( !openScope ) { + $document.bind('click', closeDropdown); + $document.bind('keydown', escapeKeyBind); + } + + if ( openScope && openScope !== dropdownScope ) { + openScope.isOpen = false; + } + + openScope = dropdownScope; + }; + + this.close = function( dropdownScope ) { + if ( openScope === dropdownScope ) { + openScope = null; + $document.unbind('click', closeDropdown); + $document.unbind('keydown', escapeKeyBind); + } + }; + + var closeDropdown = function( evt ) { + if (evt && evt.isDefaultPrevented()) { + return; + } + + openScope.$apply(function() { + openScope.isOpen = false; + }); + }; + + var escapeKeyBind = function( evt ) { + if ( evt.which === 27 ) { + openScope.focusToggleElement(); + closeDropdown(); + } + }; +}]) + +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop; + + this.init = function( element ) { + self.$element = element; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } + }; + + this.toggle = function( open ) { + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; + }; + + // Allow other directives to watch status + this.isOpen = function() { + return scope.isOpen; + }; + + scope.focusToggleElement = function() { + if ( self.toggleElement ) { + self.toggleElement[0].focus(); + } + }; + + scope.$watch('isOpen', function( isOpen, wasOpen ) { + $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass); + + if ( isOpen ) { + scope.focusToggleElement(); + dropdownService.open( scope ); + } else { + dropdownService.close( scope ); + } + + setIsOpen($scope, isOpen); + if (angular.isDefined(isOpen) && isOpen !== wasOpen) { + toggleInvoker($scope, { open: !!isOpen }); + } + }); + + $scope.$on('$locationChangeSuccess', function() { + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); + }); +}]) + +.directive('dropdown', function() { + return { + restrict: 'CA', + controller: 'DropdownController', + link: function(scope, element, attrs, dropdownCtrl) { + dropdownCtrl.init( element ); + } + }; +}) + +.directive('dropdownToggle', function() { + return { + restrict: 'CA', + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + + dropdownCtrl.toggleElement = element; + + var toggleDropdown = function(event) { + event.preventDefault(); + + if ( !element.hasClass('disabled') && !attrs.disabled ) { + scope.$apply(function() { + dropdownCtrl.toggle(); + }); + } + }; + + element.bind('click', toggleDropdown); + + // WAI-ARIA + element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); + scope.$watch(dropdownCtrl.isOpen, function( isOpen ) { + element.attr('aria-expanded', !!isOpen); + }); + + scope.$on('$destroy', function() { + element.unbind('click', toggleDropdown); + }); + } + }; +}); + +angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) + +/** + * A helper, internal data structure that acts as a map but also allows getting / removing + * elements in the LIFO order + */ + .factory('$$stackedMap', function () { + return { + createNew: function () { + var stack = []; + + return { + add: function (key, value) { + stack.push({ + key: key, + value: value + }); + }, + get: function (key) { + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + return stack[i]; + } + } + }, + keys: function() { + var keys = []; + for (var i = 0; i < stack.length; i++) { + keys.push(stack[i].key); + } + return keys; + }, + top: function () { + return stack[stack.length - 1]; + }, + remove: function (key) { + var idx = -1; + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + idx = i; + break; + } + } + return stack.splice(idx, 1)[0]; + }, + removeTop: function () { + return stack.splice(stack.length - 1, 1)[0]; + }, + length: function () { + return stack.length; + } + }; + } + }; + }) + +/** + * A helper directive for the $modal service. It creates a backdrop element. + */ + .directive('modalBackdrop', ['$timeout', function ($timeout) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/modal/backdrop.html', + link: function (scope) { + + scope.animate = false; + + //trigger CSS transitions + $timeout(function () { + scope.animate = true; + }); + } + }; + }]) + + .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { + return { + restrict: 'EA', + scope: { + index: '@', + animate: '=' + }, + replace: true, + transclude: true, + templateUrl: function(tElement, tAttrs) { + return tAttrs.templateUrl || 'template/modal/window.html'; + }, + link: function (scope, element, attrs) { + element.addClass(attrs.windowClass || ''); + scope.size = attrs.size; + + $timeout(function () { + // trigger CSS transitions + scope.animate = true; + // focus a freshly-opened modal + element[0].focus(); + }); + + scope.close = function (evt) { + var modal = $modalStack.getTop(); + if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { + evt.preventDefault(); + evt.stopPropagation(); + $modalStack.dismiss(modal.key, 'backdrop click'); + } + }; + } + }; + }]) + + .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', + function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { + + var OPENED_MODAL_CLASS = 'modal-open'; + + var backdropDomEl, backdropScope; + var openedWindows = $$stackedMap.createNew(); + var $modalStack = {}; + + function backdropIndex() { + var topBackdropIndex = -1; + var opened = openedWindows.keys(); + for (var i = 0; i < opened.length; i++) { + if (openedWindows.get(opened[i]).value.backdrop) { + topBackdropIndex = i; + } + } + return topBackdropIndex; + } + + $rootScope.$watch(backdropIndex, function(newBackdropIndex){ + if (backdropScope) { + backdropScope.index = newBackdropIndex; + } + }); + + function removeModalWindow(modalInstance) { + + var body = $document.find('body').eq(0); + var modalWindow = openedWindows.get(modalInstance).value; + + //clean up the stack + openedWindows.remove(modalInstance); + + //remove window DOM element + removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() { + modalWindow.modalScope.$destroy(); + body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); + checkRemoveBackdrop(); + }); + } + + function checkRemoveBackdrop() { + //remove backdrop if no longer needed + if (backdropDomEl && backdropIndex() == -1) { + var backdropScopeRef = backdropScope; + removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { + backdropScopeRef.$destroy(); + backdropScopeRef = null; + }); + backdropDomEl = undefined; + backdropScope = undefined; + } + } + + function removeAfterAnimate(domEl, scope, emulateTime, done) { + // Closing animation + scope.animate = false; + + var transitionEndEventName = $transition.transitionEndEventName; + if (transitionEndEventName) { + // transition out + var timeout = $timeout(afterAnimating, emulateTime); + + domEl.bind(transitionEndEventName, function () { + $timeout.cancel(timeout); + afterAnimating(); + scope.$apply(); + }); + } else { + // Ensure this call is async + $timeout(afterAnimating, 0); + } + + function afterAnimating() { + if (afterAnimating.done) { + return; + } + afterAnimating.done = true; + + domEl.remove(); + if (done) { + done(); + } + } + } + + $document.bind('keydown', function (evt) { + var modal; + + if (evt.which === 27) { + modal = openedWindows.top(); + if (modal && modal.value.keyboard) { + evt.preventDefault(); + $rootScope.$apply(function () { + $modalStack.dismiss(modal.key, 'escape key press'); + }); + } + } + }); + + $modalStack.open = function (modalInstance, modal) { + + openedWindows.add(modalInstance, { + deferred: modal.deferred, + modalScope: modal.scope, + backdrop: modal.backdrop, + keyboard: modal.keyboard + }); + + var body = $document.find('body').eq(0), + currBackdropIndex = backdropIndex(); + + if (currBackdropIndex >= 0 && !backdropDomEl) { + backdropScope = $rootScope.$new(true); + backdropScope.index = currBackdropIndex; + backdropDomEl = $compile('
    ')(backdropScope); + body.append(backdropDomEl); + } + + var angularDomEl = angular.element('
    '); + angularDomEl.attr({ + 'template-url': modal.windowTemplateUrl, + 'window-class': modal.windowClass, + 'size': modal.size, + 'index': openedWindows.length() - 1, + 'animate': 'animate' + }).html(modal.content); + + var modalDomEl = $compile(angularDomEl)(modal.scope); + openedWindows.top().value.modalDomEl = modalDomEl; + body.append(modalDomEl); + body.addClass(OPENED_MODAL_CLASS); + }; + + $modalStack.close = function (modalInstance, result) { + var modalWindow = openedWindows.get(modalInstance).value; + if (modalWindow) { + modalWindow.deferred.resolve(result); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismiss = function (modalInstance, reason) { + var modalWindow = openedWindows.get(modalInstance).value; + if (modalWindow) { + modalWindow.deferred.reject(reason); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismissAll = function (reason) { + var topModal = this.getTop(); + while (topModal) { + this.dismiss(topModal.key, reason); + topModal = this.getTop(); + } + }; + + $modalStack.getTop = function () { + return openedWindows.top(); + }; + + return $modalStack; + }]) + + .provider('$modal', function () { + + var $modalProvider = { + options: { + backdrop: true, //can be also false or 'static' + keyboard: true + }, + $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', + function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { + + var $modal = {}; + + function getTemplatePromise(options) { + return options.template ? $q.when(options.template) : + $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { + return result.data; + }); + } + + function getResolvePromises(resolves) { + var promisesArr = []; + angular.forEach(resolves, function (value, key) { + if (angular.isFunction(value) || angular.isArray(value)) { + promisesArr.push($q.when($injector.invoke(value))); + } + }); + return promisesArr; + } + + $modal.open = function (modalOptions) { + + var modalResultDeferred = $q.defer(); + var modalOpenedDeferred = $q.defer(); + + //prepare an instance of a modal to be injected into controllers and returned to a caller + var modalInstance = { + result: modalResultDeferred.promise, + opened: modalOpenedDeferred.promise, + close: function (result) { + $modalStack.close(modalInstance, result); + }, + dismiss: function (reason) { + $modalStack.dismiss(modalInstance, reason); + } + }; + + //merge and clean up options + modalOptions = angular.extend({}, $modalProvider.options, modalOptions); + modalOptions.resolve = modalOptions.resolve || {}; + + //verify options + if (!modalOptions.template && !modalOptions.templateUrl) { + throw new Error('One of template or templateUrl options is required.'); + } + + var templateAndResolvePromise = + $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); + + + templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { + + var modalScope = (modalOptions.scope || $rootScope).$new(); + modalScope.$close = modalInstance.close; + modalScope.$dismiss = modalInstance.dismiss; + + var ctrlInstance, ctrlLocals = {}; + var resolveIter = 1; + + //controllers + if (modalOptions.controller) { + ctrlLocals.$scope = modalScope; + ctrlLocals.$modalInstance = modalInstance; + angular.forEach(modalOptions.resolve, function (value, key) { + ctrlLocals[key] = tplAndVars[resolveIter++]; + }); + + ctrlInstance = $controller(modalOptions.controller, ctrlLocals); + } + + $modalStack.open(modalInstance, { + scope: modalScope, + deferred: modalResultDeferred, + content: tplAndVars[0], + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + windowClass: modalOptions.windowClass, + windowTemplateUrl: modalOptions.windowTemplateUrl, + size: modalOptions.size + }); + + }, function resolveError(reason) { + modalResultDeferred.reject(reason); + }); + + templateAndResolvePromise.then(function () { + modalOpenedDeferred.resolve(true); + }, function () { + modalOpenedDeferred.reject(false); + }); + + return modalInstance; + }; + + return $modal; + }] + }; + + return $modalProvider; + }); + +angular.module('ui.bootstrap.pagination', []) + +.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; + + this.init = function(ngModelCtrl_, config) { + ngModelCtrl = ngModelCtrl_; + this.config = config; + + ngModelCtrl.$render = function() { + self.render(); + }; + + if ($attrs.itemsPerPage) { + $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { + self.itemsPerPage = parseInt(value, 10); + $scope.totalPages = self.calculateTotalPages(); + }); + } else { + this.itemsPerPage = config.itemsPerPage; + } + }; + + this.calculateTotalPages = function() { + var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); + return Math.max(totalPages || 0, 1); + }; + + this.render = function() { + $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1; + }; + + $scope.selectPage = function(page) { + if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) { + ngModelCtrl.$setViewValue(page); + ngModelCtrl.$render(); + } + }; + + $scope.getText = function( key ) { + return $scope[key + 'Text'] || self.config[key + 'Text']; + }; + $scope.noPrevious = function() { + return $scope.page === 1; + }; + $scope.noNext = function() { + return $scope.page === $scope.totalPages; + }; + + $scope.$watch('totalItems', function() { + $scope.totalPages = self.calculateTotalPages(); + }); + + $scope.$watch('totalPages', function(value) { + setNumPages($scope.$parent, value); // Readonly variable + + if ( $scope.page > value ) { + $scope.selectPage(value); + } else { + ngModelCtrl.$render(); + } + }); +}]) + +.constant('paginationConfig', { + itemsPerPage: 10, + boundaryLinks: false, + directionLinks: true, + firstText: 'First', + previousText: 'Previous', + nextText: 'Next', + lastText: 'Last', + rotate: true +}) + +.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + firstText: '@', + previousText: '@', + nextText: '@', + lastText: '@' + }, + require: ['pagination', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pagination.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + // Setup configuration parameters + var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize, + rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks; + + paginationCtrl.init(ngModelCtrl, paginationConfig); + + if (attrs.maxSize) { + scope.$parent.$watch($parse(attrs.maxSize), function(value) { + maxSize = parseInt(value, 10); + paginationCtrl.render(); + }); + } + + // Create page object used in template + function makePage(number, text, isActive) { + return { + number: number, + text: text, + active: isActive + }; + } + + function getPages(currentPage, totalPages) { + var pages = []; + + // Default page limits + var startPage = 1, endPage = totalPages; + var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); + + // recompute if maxSize + if ( isMaxSized ) { + if ( rotate ) { + // Current page is displayed in the middle of the visible ones + startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); + endPage = startPage + maxSize - 1; + + // Adjust if limit is exceeded + if (endPage > totalPages) { + endPage = totalPages; + startPage = endPage - maxSize + 1; + } + } else { + // Visible pages are paginated with maxSize + startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; + + // Adjust last page if limit is exceeded + endPage = Math.min(startPage + maxSize - 1, totalPages); + } + } + + // Add page number links + for (var number = startPage; number <= endPage; number++) { + var page = makePage(number, number, number === currentPage); + pages.push(page); + } + + // Add links to move between page sets + if ( isMaxSized && ! rotate ) { + if ( startPage > 1 ) { + var previousPageSet = makePage(startPage - 1, '...', false); + pages.unshift(previousPageSet); + } + + if ( endPage < totalPages ) { + var nextPageSet = makePage(endPage + 1, '...', false); + pages.push(nextPageSet); + } + } + + return pages; + } + + var originalRender = paginationCtrl.render; + paginationCtrl.render = function() { + originalRender(); + if (scope.page > 0 && scope.page <= scope.totalPages) { + scope.pages = getPages(scope.page, scope.totalPages); + } + }; + } + }; +}]) + +.constant('pagerConfig', { + itemsPerPage: 10, + previousText: '« Previous', + nextText: 'Next »', + align: true +}) + +.directive('pager', ['pagerConfig', function(pagerConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + previousText: '@', + nextText: '@' + }, + require: ['pager', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pager.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align; + paginationCtrl.init(ngModelCtrl, pagerConfig); + } + }; +}]); + +/** + * The following features are still outstanding: animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html tooltips, and selector delegation. + */ +angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) + +/** + * The $tooltip service creates tooltip- and popover-like directives as well as + * houses global options for them. + */ +.provider( '$tooltip', function () { + // The default options tooltip and popover. + var defaultOptions = { + placement: 'top', + animation: true, + popupDelay: 0 + }; + + // Default hide triggers for each show trigger + var triggerMap = { + 'mouseenter': 'mouseleave', + 'click': 'click', + 'focus': 'blur' + }; + + // The options specified to the provider globally. + var globalOptions = {}; + + /** + * `options({})` allows global configuration of all tooltips in the + * application. + * + * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { + * // place tooltips left instead of top by default + * $tooltipProvider.options( { placement: 'left' } ); + * }); + */ + this.options = function( value ) { + angular.extend( globalOptions, value ); + }; + + /** + * This allows you to extend the set of trigger mappings available. E.g.: + * + * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); + */ + this.setTriggers = function setTriggers ( triggers ) { + angular.extend( triggerMap, triggers ); + }; + + /** + * This is a helper function for translating camel-case to snake-case. + */ + function snake_case(name){ + var regexp = /[A-Z]/g; + var separator = '-'; + return name.replace(regexp, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); + } + + /** + * Returns the actual instance of the $tooltip service. + * TODO support multiple triggers + */ + this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { + return function $tooltip ( type, prefix, defaultTriggerShow ) { + var options = angular.extend( {}, defaultOptions, globalOptions ); + + /** + * Returns an object of show and hide triggers. + * + * If a trigger is supplied, + * it is used to show the tooltip; otherwise, it will use the `trigger` + * option passed to the `$tooltipProvider.options` method; else it will + * default to the trigger supplied to this directive factory. + * + * The hide trigger is based on the show trigger. If the `trigger` option + * was passed to the `$tooltipProvider.options` method, it will use the + * mapped trigger from `triggerMap` or the passed trigger if the map is + * undefined; otherwise, it uses the `triggerMap` value of the show + * trigger; else it will just use the show trigger. + */ + function getTriggers ( trigger ) { + var show = trigger || options.trigger || defaultTriggerShow; + var hide = triggerMap[show] || show; + return { + show: show, + hide: hide + }; + } + + var directiveName = snake_case( type ); + + var startSym = $interpolate.startSymbol(); + var endSym = $interpolate.endSymbol(); + var template = + '
    '+ + '
    '; + + return { + restrict: 'EA', + scope: true, + compile: function (tElem, tAttrs) { + var tooltipLinker = $compile( template ); + + return function link ( scope, element, attrs ) { + var tooltip; + var transitionTimeout; + var popupTimeout; + var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; + var triggers = getTriggers( undefined ); + var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); + + var positionTooltip = function () { + + var ttPosition = $position.positionElements(element, tooltip, scope.tt_placement, appendToBody); + ttPosition.top += 'px'; + ttPosition.left += 'px'; + + // Now set the calculated positioning. + tooltip.css( ttPosition ); + }; + + // By default, the tooltip is not open. + // TODO add ability to start tooltip opened + scope.tt_isOpen = false; + + function toggleTooltipBind () { + if ( ! scope.tt_isOpen ) { + showTooltipBind(); + } else { + hideTooltipBind(); + } + } + + // Show the tooltip with delay if specified, otherwise show it immediately + function showTooltipBind() { + if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { + return; + } + if ( scope.tt_popupDelay ) { + // Do nothing if the tooltip was already scheduled to pop-up. + // This happens if show is triggered multiple times before any hide is triggered. + if (!popupTimeout) { + popupTimeout = $timeout( show, scope.tt_popupDelay, false ); + popupTimeout.then(function(reposition){reposition();}); + } + } else { + show()(); + } + } + + function hideTooltipBind () { + scope.$apply(function () { + hide(); + }); + } + + // Show the tooltip popup element. + function show() { + + popupTimeout = null; + + // If there is a pending remove transition, we must cancel it, lest the + // tooltip be mysteriously removed. + if ( transitionTimeout ) { + $timeout.cancel( transitionTimeout ); + transitionTimeout = null; + } + + // Don't show empty tooltips. + if ( ! scope.tt_content ) { + return angular.noop; + } + + createTooltip(); + + // Set the initial positioning. + tooltip.css({ top: 0, left: 0, display: 'block' }); + + // Now we add it to the DOM because need some info about it. But it's not + // visible yet anyway. + if ( appendToBody ) { + $document.find( 'body' ).append( tooltip ); + } else { + element.after( tooltip ); + } + + positionTooltip(); + + // And show the tooltip. + scope.tt_isOpen = true; + scope.$digest(); // digest required as $apply is not called + + // Return positioning function as promise callback for correct + // positioning after draw. + return positionTooltip; + } + + // Hide the tooltip popup element. + function hide() { + // First things first: we don't show it anymore. + scope.tt_isOpen = false; + + //if tooltip is going to be shown after delay, we must cancel this + $timeout.cancel( popupTimeout ); + popupTimeout = null; + + // And now we remove it from the DOM. However, if we have animation, we + // need to wait for it to expire beforehand. + // FIXME: this is a placeholder for a port of the transitions library. + if ( scope.tt_animation ) { + if (!transitionTimeout) { + transitionTimeout = $timeout(removeTooltip, 500); + } + } else { + removeTooltip(); + } + } + + function createTooltip() { + // There can only be one tooltip element per directive shown at once. + if (tooltip) { + removeTooltip(); + } + tooltip = tooltipLinker(scope, function () {}); + + // Get contents rendered into the tooltip + scope.$digest(); + } + + function removeTooltip() { + transitionTimeout = null; + if (tooltip) { + tooltip.remove(); + tooltip = null; + } + } + + /** + * Observe the relevant attributes. + */ + attrs.$observe( type, function ( val ) { + scope.tt_content = val; + + if (!val && scope.tt_isOpen ) { + hide(); + } + }); + + attrs.$observe( prefix+'Title', function ( val ) { + scope.tt_title = val; + }); + + attrs.$observe( prefix+'Placement', function ( val ) { + scope.tt_placement = angular.isDefined( val ) ? val : options.placement; + }); + + attrs.$observe( prefix+'PopupDelay', function ( val ) { + var delay = parseInt( val, 10 ); + scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; + }); + + var unregisterTriggers = function () { + element.unbind(triggers.show, showTooltipBind); + element.unbind(triggers.hide, hideTooltipBind); + }; + + attrs.$observe( prefix+'Trigger', function ( val ) { + unregisterTriggers(); + + triggers = getTriggers( val ); + + if ( triggers.show === triggers.hide ) { + element.bind( triggers.show, toggleTooltipBind ); + } else { + element.bind( triggers.show, showTooltipBind ); + element.bind( triggers.hide, hideTooltipBind ); + } + }); + + var animation = scope.$eval(attrs[prefix + 'Animation']); + scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; + + attrs.$observe( prefix+'AppendToBody', function ( val ) { + appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; + }); + + // if a tooltip is attached to we need to remove it on + // location change as its parent scope will probably not be destroyed + // by the change. + if ( appendToBody ) { + scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { + if ( scope.tt_isOpen ) { + hide(); + } + }); + } + + // Make sure tooltip is destroyed and removed. + scope.$on('$destroy', function onDestroyTooltip() { + $timeout.cancel( transitionTimeout ); + $timeout.cancel( popupTimeout ); + unregisterTriggers(); + removeTooltip(); + }); + }; + } + }; + }; + }]; +}) + +.directive( 'tooltipPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-popup.html' + }; +}) + +.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); +}]) + +.directive( 'tooltipHtmlUnsafePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' + }; +}) + +.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); +}]); + +/** + * The following features are still outstanding: popup delay, animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html popovers, and selector delegatation. + */ +angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) + +.directive( 'popoverPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/popover/popover.html' + }; +}) + +.directive( 'popover', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popover', 'popover', 'click' ); +}]); + +angular.module('ui.bootstrap.progressbar', []) + +.constant('progressConfig', { + animate: true, + max: 100 +}) + +.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) { + var self = this, + animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; + + this.bars = []; + $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max; + + this.addBar = function(bar, element) { + if ( !animate ) { + element.css({'transition': 'none'}); + } + + this.bars.push(bar); + + bar.$watch('value', function( value ) { + bar.percent = +(100 * value / $scope.max).toFixed(2); + }); + + bar.$on('$destroy', function() { + element = null; + self.removeBar(bar); + }); + }; + + this.removeBar = function(bar) { + this.bars.splice(this.bars.indexOf(bar), 1); + }; +}]) + +.directive('progress', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + require: 'progress', + scope: {}, + templateUrl: 'template/progressbar/progress.html' + }; +}) + +.directive('bar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + require: '^progress', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/bar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, element); + } + }; +}) + +.directive('progressbar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/progressbar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, angular.element(element.children()[0])); + } + }; +}); +angular.module('ui.bootstrap.rating', []) + +.constant('ratingConfig', { + max: 5, + stateOn: null, + stateOff: null +}) + +.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) { + var ngModelCtrl = { $setViewValue: angular.noop }; + + this.init = function(ngModelCtrl_) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; + this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; + + var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) : + new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max ); + $scope.range = this.buildTemplateObjects(ratingStates); + }; + + this.buildTemplateObjects = function(states) { + for (var i = 0, n = states.length; i < n; i++) { + states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]); + } + return states; + }; + + $scope.rate = function(value) { + if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) { + ngModelCtrl.$setViewValue(value); + ngModelCtrl.$render(); + } + }; + + $scope.enter = function(value) { + if ( !$scope.readonly ) { + $scope.value = value; + } + $scope.onHover({value: value}); + }; + + $scope.reset = function() { + $scope.value = ngModelCtrl.$viewValue; + $scope.onLeave(); + }; + + $scope.onKeydown = function(evt) { + if (/(37|38|39|40)/.test(evt.which)) { + evt.preventDefault(); + evt.stopPropagation(); + $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) ); + } + }; + + this.render = function() { + $scope.value = ngModelCtrl.$viewValue; + }; +}]) + +.directive('rating', function() { + return { + restrict: 'EA', + require: ['rating', 'ngModel'], + scope: { + readonly: '=?', + onHover: '&', + onLeave: '&' + }, + controller: 'RatingController', + templateUrl: 'template/rating/rating.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + ratingCtrl.init( ngModelCtrl ); + } + } + }; +}); + +/** + * @ngdoc overview + * @name ui.bootstrap.tabs + * + * @description + * AngularJS version of the tabs directive. + */ + +angular.module('ui.bootstrap.tabs', []) + +.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { + var ctrl = this, + tabs = ctrl.tabs = $scope.tabs = []; + + ctrl.select = function(selectedTab) { + angular.forEach(tabs, function(tab) { + if (tab.active && tab !== selectedTab) { + tab.active = false; + tab.onDeselect(); + } + }); + selectedTab.active = true; + selectedTab.onSelect(); + }; + + ctrl.addTab = function addTab(tab) { + tabs.push(tab); + // we can't run the select function on the first tab + // since that would select it twice + if (tabs.length === 1) { + tab.active = true; + } else if (tab.active) { + ctrl.select(tab); + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = tabs.indexOf(tab); + //Select a new tab if the tab to be removed is selected + if (tab.active && tabs.length > 1) { + //If this is the last tab, select the previous tab. else, the next tab. + var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; + ctrl.select(tabs[newActiveIndex]); + } + tabs.splice(index, 1); + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabset + * @restrict EA + * + * @description + * Tabset is the outer container for the tabs directive + * + * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. + * @param {boolean=} justified Whether or not to use justified styling for the tabs. + * + * @example + + + + First Content! + Second Content! + +
    + + First Vertical Content! + Second Vertical Content! + + + First Justified Content! + Second Justified Content! + +
    +
    + */ +.directive('tabset', function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + scope: { + type: '@' + }, + controller: 'TabsetController', + templateUrl: 'template/tabs/tabset.html', + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tab + * @restrict EA + * + * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. + * @param {string=} select An expression to evaluate when the tab is selected. + * @param {boolean=} active A binding, telling whether or not this tab is selected. + * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. + * + * @description + * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. + * + * @example + + +
    + + +
    + + First Tab + + Alert me! + Second Tab, with alert callback and html heading! + + + {{item.content}} + + +
    +
    + + function TabsDemoCtrl($scope) { + $scope.items = [ + { title:"Dynamic Title 1", content:"Dynamic Item 0" }, + { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } + ]; + + $scope.alertMe = function() { + setTimeout(function() { + alert("You've selected the alert tab!"); + }); + }; + }; + +
    + */ + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabHeading + * @restrict EA + * + * @description + * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. + * + * @example + + + + + HTML in my titles?! + And some content, too! + + + Icon heading?!? + That's right. + + + + + */ +.directive('tab', ['$parse', function($parse) { + return { + require: '^tabset', + restrict: 'EA', + replace: true, + templateUrl: 'template/tabs/tab.html', + transclude: true, + scope: { + active: '=?', + heading: '@', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + compile: function(elm, attrs, transclude) { + return function postLink(scope, elm, attrs, tabsetCtrl) { + scope.$watch('active', function(active) { + if (active) { + tabsetCtrl.select(scope); + } + }); + + scope.disabled = false; + if ( attrs.disabled ) { + scope.$parent.$watch($parse(attrs.disabled), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if ( !scope.disabled ) { + scope.active = true; + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + }; + } + }; +}]) + +.directive('tabHeadingTransclude', [function() { + return { + restrict: 'A', + require: '^tab', + link: function(scope, elm, attrs, tabCtrl) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}]) + +.directive('tabContentTransclude', function() { + return { + restrict: 'A', + require: '^tabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.tabContentTransclude); + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('tab-heading') || + node.hasAttribute('data-tab-heading') || + node.tagName.toLowerCase() === 'tab-heading' || + node.tagName.toLowerCase() === 'data-tab-heading' + ); + } +}) + +; + +angular.module('ui.bootstrap.timepicker', []) + +.constant('timepickerConfig', { + hourStep: 1, + minuteStep: 1, + showMeridian: true, + meridians: null, + readonlyInput: false, + mousewheel: true +}) + +.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) { + var selected = new Date(), + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; + + this.init = function( ngModelCtrl_, inputs ) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + var hoursInputEl = inputs.eq(0), + minutesInputEl = inputs.eq(1); + + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; + if ( mousewheel ) { + this.setupMousewheelEvents( hoursInputEl, minutesInputEl ); + } + + $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput; + this.setupInputEvents( hoursInputEl, minutesInputEl ); + }; + + var hourStep = timepickerConfig.hourStep; + if ($attrs.hourStep) { + $scope.$parent.$watch($parse($attrs.hourStep), function(value) { + hourStep = parseInt(value, 10); + }); + } + + var minuteStep = timepickerConfig.minuteStep; + if ($attrs.minuteStep) { + $scope.$parent.$watch($parse($attrs.minuteStep), function(value) { + minuteStep = parseInt(value, 10); + }); + } + + // 12H / 24H mode + $scope.showMeridian = timepickerConfig.showMeridian; + if ($attrs.showMeridian) { + $scope.$parent.$watch($parse($attrs.showMeridian), function(value) { + $scope.showMeridian = !!value; + + if ( ngModelCtrl.$error.time ) { + // Evaluate from template + var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); + if (angular.isDefined( hours ) && angular.isDefined( minutes )) { + selected.setHours( hours ); + refresh(); + } + } else { + updateTemplate(); + } + }); + } + + // Get $scope.hours in 24H mode if valid + function getHoursFromTemplate ( ) { + var hours = parseInt( $scope.hours, 10 ); + var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); + if ( !valid ) { + return undefined; + } + + if ( $scope.showMeridian ) { + if ( hours === 12 ) { + hours = 0; + } + if ( $scope.meridian === meridians[1] ) { + hours = hours + 12; + } + } + return hours; + } + + function getMinutesFromTemplate() { + var minutes = parseInt($scope.minutes, 10); + return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; + } + + function pad( value ) { + return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; + } + + // Respond on mousewheel spin + this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) { + var isScrollingUp = function(e) { + if (e.originalEvent) { + e = e.originalEvent; + } + //pick correct delta variable depending on event + var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; + return (e.detail || delta > 0); + }; + + hoursInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() ); + e.preventDefault(); + }); + + minutesInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() ); + e.preventDefault(); + }); + + }; + + this.setupInputEvents = function( hoursInputEl, minutesInputEl ) { + if ( $scope.readonlyInput ) { + $scope.updateHours = angular.noop; + $scope.updateMinutes = angular.noop; + return; + } + + var invalidate = function(invalidHours, invalidMinutes) { + ngModelCtrl.$setViewValue( null ); + ngModelCtrl.$setValidity('time', false); + if (angular.isDefined(invalidHours)) { + $scope.invalidHours = invalidHours; + } + if (angular.isDefined(invalidMinutes)) { + $scope.invalidMinutes = invalidMinutes; + } + }; + + $scope.updateHours = function() { + var hours = getHoursFromTemplate(); + + if ( angular.isDefined(hours) ) { + selected.setHours( hours ); + refresh( 'h' ); + } else { + invalidate(true); + } + }; + + hoursInputEl.bind('blur', function(e) { + if ( !$scope.invalidHours && $scope.hours < 10) { + $scope.$apply( function() { + $scope.hours = pad( $scope.hours ); + }); + } + }); + + $scope.updateMinutes = function() { + var minutes = getMinutesFromTemplate(); + + if ( angular.isDefined(minutes) ) { + selected.setMinutes( minutes ); + refresh( 'm' ); + } else { + invalidate(undefined, true); + } + }; + + minutesInputEl.bind('blur', function(e) { + if ( !$scope.invalidMinutes && $scope.minutes < 10 ) { + $scope.$apply( function() { + $scope.minutes = pad( $scope.minutes ); + }); + } + }); + + }; + + this.render = function() { + var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null; + + if ( isNaN(date) ) { + ngModelCtrl.$setValidity('time', false); + $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } else { + if ( date ) { + selected = date; + } + makeValid(); + updateTemplate(); + } + }; + + // Call internally when we know that model is valid. + function refresh( keyboardChange ) { + makeValid(); + ngModelCtrl.$setViewValue( new Date(selected) ); + updateTemplate( keyboardChange ); + } + + function makeValid() { + ngModelCtrl.$setValidity('time', true); + $scope.invalidHours = false; + $scope.invalidMinutes = false; + } + + function updateTemplate( keyboardChange ) { + var hours = selected.getHours(), minutes = selected.getMinutes(); + + if ( $scope.showMeridian ) { + hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system + } + + $scope.hours = keyboardChange === 'h' ? hours : pad(hours); + $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); + $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; + } + + function addMinutes( minutes ) { + var dt = new Date( selected.getTime() + minutes * 60000 ); + selected.setHours( dt.getHours(), dt.getMinutes() ); + refresh(); + } + + $scope.incrementHours = function() { + addMinutes( hourStep * 60 ); + }; + $scope.decrementHours = function() { + addMinutes( - hourStep * 60 ); + }; + $scope.incrementMinutes = function() { + addMinutes( minuteStep ); + }; + $scope.decrementMinutes = function() { + addMinutes( - minuteStep ); + }; + $scope.toggleMeridian = function() { + addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); + }; +}]) + +.directive('timepicker', function () { + return { + restrict: 'EA', + require: ['timepicker', '?^ngModel'], + controller:'TimepickerController', + replace: true, + scope: {}, + templateUrl: 'template/timepicker/timepicker.html', + link: function(scope, element, attrs, ctrls) { + var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + timepickerCtrl.init( ngModelCtrl, element.find('input') ); + } + } + }; +}); + +angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) + +/** + * A helper service that can parse typeahead's syntax (string provided by users) + * Extracted to a separate service for ease of unit testing + */ + .factory('typeaheadParser', ['$parse', function ($parse) { + + // 00000111000000000000022200000000000000003333333333333330000000000044000 + var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; + + return { + parse:function (input) { + + var match = input.match(TYPEAHEAD_REGEXP); + if (!match) { + throw new Error( + 'Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_"' + + ' but got "' + input + '".'); + } + + return { + itemName:match[3], + source:$parse(match[4]), + viewMapper:$parse(match[2] || match[1]), + modelMapper:$parse(match[1]) + }; + } + }; +}]) + + .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', + function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { + + var HOT_KEYS = [9, 13, 27, 38, 40]; + + return { + require:'ngModel', + link:function (originalScope, element, attrs, modelCtrl) { + + //SUPPORTED ATTRIBUTES (OPTIONS) + + //minimal no of characters that needs to be entered before typeahead kicks-in + var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; + + //minimal wait time after last character typed before typehead kicks-in + var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; + + //should it restrict model values to the ones selected from the popup only? + var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; + + //binding to a variable that indicates if matches are being retrieved asynchronously + var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; + + //a callback executed when a match is selected + var onSelectCallback = $parse(attrs.typeaheadOnSelect); + + var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; + + var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false; + + //INTERNAL VARIABLES + + //model setter executed upon match selection + var $setModelValue = $parse(attrs.ngModel).assign; + + //expressions used by typeahead + var parserResult = typeaheadParser.parse(attrs.typeahead); + + var hasFocus; + + //create a child scope for the typeahead directive so we are not polluting original scope + //with typeahead-specific data (matches, query etc.) + var scope = originalScope.$new(); + originalScope.$on('$destroy', function(){ + scope.$destroy(); + }); + + // WAI-ARIA + var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000); + element.attr({ + 'aria-autocomplete': 'list', + 'aria-expanded': false, + 'aria-owns': popupId + }); + + //pop-up element used to display matches + var popUpEl = angular.element('
    '); + popUpEl.attr({ + id: popupId, + matches: 'matches', + active: 'activeIdx', + select: 'select(activeIdx)', + query: 'query', + position: 'position' + }); + //custom item template + if (angular.isDefined(attrs.typeaheadTemplateUrl)) { + popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); + } + + var resetMatches = function() { + scope.matches = []; + scope.activeIdx = -1; + element.attr('aria-expanded', false); + }; + + var getMatchId = function(index) { + return popupId + '-option-' + index; + }; + + // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead. + // This attribute is added or removed automatically when the `activeIdx` changes. + scope.$watch('activeIdx', function(index) { + if (index < 0) { + element.removeAttr('aria-activedescendant'); + } else { + element.attr('aria-activedescendant', getMatchId(index)); + } + }); + + var getMatchesAsync = function(inputValue) { + + var locals = {$viewValue: inputValue}; + isLoadingSetter(originalScope, true); + $q.when(parserResult.source(originalScope, locals)).then(function(matches) { + + //it might happen that several async queries were in progress if a user were typing fast + //but we are interested only in responses that correspond to the current view value + var onCurrentRequest = (inputValue === modelCtrl.$viewValue); + if (onCurrentRequest && hasFocus) { + if (matches.length > 0) { + + scope.activeIdx = 0; + scope.matches.length = 0; + + //transform labels + for(var i=0; i= minSearch) { + if (waitTime > 0) { + if (timeoutPromise) { + $timeout.cancel(timeoutPromise);//cancel previous timeout + } + timeoutPromise = $timeout(function () { + getMatchesAsync(inputValue); + }, waitTime); + } else { + getMatchesAsync(inputValue); + } + } else { + isLoadingSetter(originalScope, false); + resetMatches(); + } + + if (isEditable) { + return inputValue; + } else { + if (!inputValue) { + // Reset in case user had typed something previously. + modelCtrl.$setValidity('editable', true); + return inputValue; + } else { + modelCtrl.$setValidity('editable', false); + return undefined; + } + } + }); + + modelCtrl.$formatters.push(function (modelValue) { + + var candidateViewValue, emptyViewValue; + var locals = {}; + + if (inputFormatter) { + + locals['$model'] = modelValue; + return inputFormatter(originalScope, locals); + + } else { + + //it might happen that we don't have enough info to properly render input value + //we need to check for this situation and simply return model value if we can't apply custom formatting + locals[parserResult.itemName] = modelValue; + candidateViewValue = parserResult.viewMapper(originalScope, locals); + locals[parserResult.itemName] = undefined; + emptyViewValue = parserResult.viewMapper(originalScope, locals); + + return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; + } + }); + + scope.select = function (activeIdx) { + //called from within the $digest() cycle + var locals = {}; + var model, item; + + locals[parserResult.itemName] = item = scope.matches[activeIdx].model; + model = parserResult.modelMapper(originalScope, locals); + $setModelValue(originalScope, model); + modelCtrl.$setValidity('editable', true); + + onSelectCallback(originalScope, { + $item: item, + $model: model, + $label: parserResult.viewMapper(originalScope, locals) + }); + + resetMatches(); + + //return focus to the input element if a match was selected via a mouse click event + // use timeout to avoid $rootScope:inprog error + $timeout(function() { element[0].focus(); }, 0, false); + }; + + //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) + element.bind('keydown', function (evt) { + + //typeahead is open and an "interesting" key was pressed + if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { + return; + } + + evt.preventDefault(); + + if (evt.which === 40) { + scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; + scope.$digest(); + + } else if (evt.which === 38) { + scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; + scope.$digest(); + + } else if (evt.which === 13 || evt.which === 9) { + scope.$apply(function () { + scope.select(scope.activeIdx); + }); + + } else if (evt.which === 27) { + evt.stopPropagation(); + + resetMatches(); + scope.$digest(); + } + }); + + element.bind('blur', function (evt) { + hasFocus = false; + }); + + // Keep reference to click handler to unbind it. + var dismissClickHandler = function (evt) { + if (element[0] !== evt.target) { + resetMatches(); + scope.$digest(); + } + }; + + $document.bind('click', dismissClickHandler); + + originalScope.$on('$destroy', function(){ + $document.unbind('click', dismissClickHandler); + }); + + var $popup = $compile(popUpEl)(scope); + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + } + }; + +}]) + + .directive('typeaheadPopup', function () { + return { + restrict:'EA', + scope:{ + matches:'=', + query:'=', + active:'=', + position:'=', + select:'&' + }, + replace:true, + templateUrl:'template/typeahead/typeahead-popup.html', + link:function (scope, element, attrs) { + + scope.templateUrl = attrs.templateUrl; + + scope.isOpen = function () { + return scope.matches.length > 0; + }; + + scope.isActive = function (matchIdx) { + return scope.active == matchIdx; + }; + + scope.selectActive = function (matchIdx) { + scope.active = matchIdx; + }; + + scope.selectMatch = function (activeIdx) { + scope.select({activeIdx:activeIdx}); + }; + } + }; + }) + + .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { + return { + restrict:'EA', + scope:{ + index:'=', + match:'=', + query:'=' + }, + link:function (scope, element, attrs) { + var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; + $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ + element.replaceWith($compile(tplContent.trim())(scope)); + }); + } + }; + }]) + + .filter('typeaheadHighlight', function() { + + function escapeRegexp(queryToEscape) { + return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + + return function(matchItem, query) { + return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; + }; + }); + +angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion-group.html", + "
    \n" + + "
    \n" + + "

    \n" + + " {{heading}}\n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion.html", + "
    "); +}]); + +angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/alert/alert.html", + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/carousel.html", + "
    \n" + + "
      1\">\n" + + "
    1. \n" + + "
    \n" + + "
    \n" + + " 1\">\n" + + " 1\">\n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/slide.html", + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/datepicker.html", + "
    \n" + + " \n" + + " \n" + + " \n" + + "
    "); +}]); + +angular.module("template/datepicker/day.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/day.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    {{label.abbr}}
    {{ weekNumbers[$index] }}\n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/month.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/month.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/popup.html", + "
      \n" + + "
    • \n" + + "
    • \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    • \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/year.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/year.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/backdrop.html", + "
    \n" + + ""); +}]); + +angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/window.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pager.html", + ""); +}]); + +angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pagination.html", + ""); +}]); + +angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover.html", + "
    \n" + + "
    \n" + + "\n" + + "
    \n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/bar.html", + "
    "); +}]); + +angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progress.html", + "
    "); +}]); + +angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progressbar.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/rating/rating.html", + "\n" + + " \n" + + " ({{ $index < value ? '*' : ' ' }})\n" + + " \n" + + ""); +}]); + +angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tab.html", + "
  • \n" + + " {{heading}}\n" + + "
  • \n" + + ""); +}]); + +angular.module("template/tabs/tabset-titles.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset-titles.html", + "
      \n" + + "
    \n" + + ""); +}]); + +angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset.html", + "\n" + + "
    \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + ""); +}]); + +angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/timepicker/timepicker.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
       
      \n" + + " \n" + + " :\n" + + " \n" + + "
       
      \n" + + ""); +}]); + +angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-match.html", + ""); +}]); + +angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-popup.html", + "
        \n" + + "
      • \n" + + "
        \n" + + "
      • \n" + + "
      "); +}]); diff --git a/common/resources/lib/angular/version.json b/common/resources/lib/angular/version.json new file mode 100755 index 0000000..7325f62 --- /dev/null +++ b/common/resources/lib/angular/version.json @@ -0,0 +1 @@ +{"raw":"v1.4.4","major":1,"minor":4,"patch":4,"prerelease":[],"build":[],"version":"1.4.4","codeName":"pylon-requirement","full":"1.4.4","branch":"v1.4.x","cdn":{"raw":"v1.4.3","major":1,"minor":4,"patch":3,"prerelease":[],"build":[],"version":"1.4.3","docsUrl":"http://code.angularjs.org/1.4.3/docs"}} \ No newline at end of file diff --git a/common/resources/lib/filesaver/FileSaver.js b/common/resources/lib/filesaver/FileSaver.js new file mode 100644 index 0000000..fb71494 --- /dev/null +++ b/common/resources/lib/filesaver/FileSaver.js @@ -0,0 +1,188 @@ +/* FileSaver.js + * A saveAs() FileSaver implementation. + * 1.3.2 + * 2016-06-16 18:25:19 + * + * By Eli Grey, http://eligrey.com + * License: MIT + * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ + +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ + +var saveAs = saveAs || (function(view) { + "use strict"; + // IE <10 is explicitly unsupported + if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { + return; + } + var + doc = view.document + // only get URL when necessary in case Blob.js hasn't overridden it yet + , get_URL = function() { + return view.URL || view.webkitURL || view; + } + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") + , can_use_save_link = "download" in save_link + , click = function(node) { + var event = new MouseEvent("click"); + node.dispatchEvent(event); + } + , is_safari = /constructor/i.test(view.HTMLElement) || view.safari + , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent) + , throw_outside = function(ex) { + (view.setImmediate || view.setTimeout)(function() { + throw ex; + }, 0); + } + , force_saveable_type = "application/octet-stream" + // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to + , arbitrary_revoke_timeout = 1000 * 40 // in ms + , revoke = function(file) { + var revoker = function() { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + }; + setTimeout(revoker, arbitrary_revoke_timeout); + } + , dispatch = function(filesaver, event_types, event) { + event_types = [].concat(event_types); + var i = event_types.length; + while (i--) { + var listener = filesaver["on" + event_types[i]]; + if (typeof listener === "function") { + try { + listener.call(filesaver, event || filesaver); + } catch (ex) { + throw_outside(ex); + } + } + } + } + , auto_bom = function(blob) { + // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); + } + return blob; + } + , FileSaver = function(blob, name, no_auto_bom) { + if (!no_auto_bom) { + blob = auto_bom(blob); + } + // First try a.download, then web filesystem, then object URLs + var + filesaver = this + , type = blob.type + , force = type === force_saveable_type + , object_url + , dispatch_all = function() { + dispatch(filesaver, "writestart progress write writeend".split(" ")); + } + // on any filesys errors revert to saving with object URLs + , fs_error = function() { + if ((is_chrome_ios || (force && is_safari)) && view.FileReader) { + // Safari doesn't allow downloading of blob urls + var reader = new FileReader(); + reader.onloadend = function() { + var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;'); + var popup = view.open(url, '_blank'); + if(!popup) view.location.href = url; + url=undefined; // release reference before dispatching + filesaver.readyState = filesaver.DONE; + dispatch_all(); + }; + reader.readAsDataURL(blob); + filesaver.readyState = filesaver.INIT; + return; + } + // don't create more object URLs than needed + if (!object_url) { + object_url = get_URL().createObjectURL(blob); + } + if (force) { + view.location.href = object_url; + } else { + var opened = view.open(object_url, "_blank"); + if (!opened) { + // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html + view.location.href = object_url; + } + } + filesaver.readyState = filesaver.DONE; + dispatch_all(); + revoke(object_url); + } + ; + filesaver.readyState = filesaver.INIT; + + if (can_use_save_link) { + object_url = get_URL().createObjectURL(blob); + setTimeout(function() { + save_link.href = object_url; + save_link.download = name; + click(save_link); + dispatch_all(); + revoke(object_url); + filesaver.readyState = filesaver.DONE; + }); + return; + } + + fs_error(); + } + , FS_proto = FileSaver.prototype + , saveAs = function(blob, name, no_auto_bom) { + return new FileSaver(blob, name || blob.name || "download", no_auto_bom); + } + ; + // IE 10+ (native saveAs) + if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { + return function(blob, name, no_auto_bom) { + name = name || blob.name || "download"; + + if (!no_auto_bom) { + blob = auto_bom(blob); + } + return navigator.msSaveOrOpenBlob(blob, name); + }; + } + + FS_proto.abort = function(){}; + FS_proto.readyState = FS_proto.INIT = 0; + FS_proto.WRITING = 1; + FS_proto.DONE = 2; + + FS_proto.error = + FS_proto.onwritestart = + FS_proto.onprogress = + FS_proto.onwrite = + FS_proto.onabort = + FS_proto.onerror = + FS_proto.onwriteend = + null; + + return saveAs; +}( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this.content +)); +// `self` is undefined in Firefox for Android content script context +// while `this` is nsIContentFrameMessageManager +// with an attribute `content` that corresponds to the window + +if (typeof module !== "undefined" && module.exports) { + module.exports.saveAs = saveAs; +} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { + define("FileSaver.js", function() { + return saveAs; + }); +} diff --git a/common/resources/lib/fileupload/FileAPI.min.js b/common/resources/lib/fileupload/FileAPI.min.js new file mode 100644 index 0000000..7cc0ff4 --- /dev/null +++ b/common/resources/lib/fileupload/FileAPI.min.js @@ -0,0 +1,72 @@ +/**! + * FileAPI — a set of tools for working with files + * + * @author RubaXa + * @build lib/canvas-to-blob lib/FileAPI.core lib/FileAPI.Image lib/FileAPI.Form lib/FileAPI.XHR lib/FileAPI.Flash + */ +(function(a){var k=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,g;if(g=a.Blob)try{g=Boolean(new Blob)}catch(j){g=!1}var m=g;if(g=m)if(g=a.Uint8Array)try{g=100===(new Blob([new Uint8Array(100)])).size}catch(f){g=!1}var c=g,e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,q=(m||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var l,f,u,g;l=0<=a.split(",")[0].indexOf("base64")?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]);f=new ArrayBuffer(l.length);u=new Uint8Array(f); +for(g=0;g= +a&&!c&&n.end()},isFail:function(){return c},fail:function(){!c&&b(c=!0)},end:function(){e||(e=!0,b())}};return n},each:g,afor:function(b,d){var a=0,c=b.length;l(b)&&c--?function B(){d(c!=a&&B,b[a],a++)}():d(!1)},extend:function(b){g(arguments,function(d){g(d,function(d,a){b[a]=d})});return b},isFile:function(b){return x&&b&&b instanceof v},isCanvas:function(b){return b&&U.test(b.nodeName)},getFilesFilter:function(b){return(b="string"==typeof b?b:b.getAttribute&&b.getAttribute("accept")||"")?RegExp("("+ +b.replace(/\./g,"\\.").replace(/,/g,"|")+")$","i"):/./},readAsDataURL:function(b,d){h.isCanvas(b)?c(b,d,"load",h.toDataURL(b)):e(b,d,"DataURL")},readAsBinaryString:function(b,d){p&&p.prototype.readAsBinaryString?e(b,d,"BinaryString"):e(b,function(b){if("load"==b.type)try{b.result=h.toBinaryString(b.result)}catch(a){b.type="error",b.message=a.toString()}d(b)},"DataURL")},readAsArrayBuffer:function(b,d){e(b,d,"ArrayBuffer")},readAsText:function(b,d,a){a||(a=d,d="utf-8");e(b,a,"Text",d)},toDataURL:function(b){if("string"== +typeof b)return b;if(b.toDataURL)return b.toDataURL("image/png")},toBinaryString:function(b){return a.atob(h.toDataURL(b).replace(I,""))},readAsImage:function(b,d,a){if(h.isFile(b))if(y){var e=y.createObjectURL(b);e===k?c(b,d,"error"):h.readAsImage(e,d,a)}else h.readAsDataURL(b,function(e){"load"==e.type?h.readAsImage(e.result,d,a):(a||"error"==e.type)&&c(b,d,e,null,{loaded:e.loaded,total:e.total})});else h.isCanvas(b)?c(b,d,"load",b):T.test(b.nodeName)?b.complete?c(b,d,"load",b):f(b,"error abort load", +function B(a){"load"==a.type&&y&&y.revokeObjectURL(b.src);m(b,"error abort load",B);c(b,d,a,b)}):b.iframe?c(b,d,{type:"error"}):(e=new Image,e.src=b.dataURL||b,h.readAsImage(e,d,a))},checkFileObj:function(b){var d={},a=h.accept;"object"==typeof b?d=b:d.name=(b+"").split(/\\|\//g).pop();null==d.type&&(d.type=d.name.split(".").pop());g(a,function(b,a){b=RegExp(b.replace(/\s/g,"|"),"i");b.test(d.type)&&(d.type=a.split("/")[0]+"/"+d.type)});return d},getDropFiles:function(b,d){var a=[],c=(b.originalEvent|| +b||"").dataTransfer||{},e=l(c.items)&&c.items[0]&&q(c.items[0]),n=h.queue(function(){d(a)});g((e?c.items:c.files)||[],function(b){n.inc();if(e)t(b,function(b,d){!b&&a.push.apply(a,d);n.next()});else{var d=function(d){d&&a.push(b);n.next()};if(!b.type&&0==b.size%4096&&102400>=b.size)if(p)try{var c=new p;f(c,K,function(b){b="error"!=b.type;d(b);b&&c.abort()});c.readAsDataURL(b)}catch(l){d(!1)}else d(null);else d(!0)}});n.check()},getFiles:function(b,d,a){var c=[];if(a)return h.filterFiles(h.getFiles(b), +d,a),null;b.jquery&&(b.each(function(){c=c.concat(h.getFiles(this))}),b=c,c=[]);"string"==typeof d&&(d=h.getFilesFilter(d));b.originalEvent?b=A(b.originalEvent):b.srcElement&&(b=A(b));b.dataTransfer?b=b.dataTransfer:b.target&&(b=b.target);b.files?c=b.files:!x&&L.test(b&&b.tagName)?h.trim(b.value)&&(c=[h.checkFileObj(b.value)],c[0].blob=b,c[0].iframe=!0):l(b)&&(c=b);return h.filter(c,function(b){return!d||d.test(b.name)})},getInfo:function(b,d){var a={},c=O.concat();h.isFile(b)?function B(){var e= +c.shift();e?e.test(b.type)?e(b,function(b,c){b?d(b):(h.extend(a,c),B())}):B():d(!1,a)}():d("not_support",a)},addInfoReader:function(b,d){d.test=function(d){return b.test(d)};O.push(d)},filter:function(b,d){for(var a=[],c=0,e=b.length,n;c>2,c=(c&3)<<4|e>>4;isNaN(e)?e=n=64:(e=(e&15)<<2|n>>6,n=isNaN(n)?64:n&63);d+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(l)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(e)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(n)}return d}};h.addInfoReader(/^image/,function(b,d){if(!b.__dimensions){var a=b.__dimensions=h.defer();h.readAsImage(b,function(b){var d=b.target;a.resolve("load"==b.type?!1:"error",{width:d.width,height:d.height})})}b.__dimensions.then(d)});h.event.dnd=function(b,d,a){var c,e;a||(a=d,d=h.F);p?(j(b,"dragenter dragleave dragover",function(b){for(var a= +((b.originalEvent||b||"").dataTransfer||{}).types,n=a&&a.length;n--;)~a[n].indexOf("File")&&(b.preventDefault(),e!==b.type&&(e=b.type,"dragleave"!=e&&d.call(b.currentTarget,!0,b),clearTimeout(c),c=setTimeout(function(){d.call(b.currentTarget,"dragleave"!=e,b)},50)))}),j(b,"drop",function(b){b.preventDefault();e=0;d.call(b.currentTarget,!1,b);h.getDropFiles(b,function(d){a.call(b.currentTarget,d,b)})})):h.log("Drag'n'Drop -- not supported")};n&&!n.fn.dnd&&(n.fn.dnd=function(b,d){return this.each(function(){h.event.dnd(this, +b,d)})});a.FileAPI=h.extend(h,a.FileAPI);h.flashUrl||(h.flashUrl=h.staticPath+"FileAPI.flash.swf");h.flashImageUrl||(h.flashImageUrl=h.staticPath+"FileAPI.flash.image.swf")})(window); +(function(a,k,g){function j(a,c){if(!(this instanceof j))return new j(a);this.file=a;this.better=!c;this.matrix={sx:0,sy:0,sw:0,sh:0,dx:0,dy:0,dw:0,dh:0,resize:0,deg:0}}var m=Math.min,f=Math.round,c=!1,e={8:270,3:180,6:90};try{c=-1=s?(s=g,r=s/j):(r=c,s=r*j),s!=g||r!=c)e.sx=~~((g-s)/2),e.sy=~~((c-r)/2),g=s,c=r}else r&&("min"==r?(q=f(s=j?m(g,q):k*s),k=f(s>=j?q/s:m(c,k))));e.sw=g;e.sh=c;e.dw=q;e.dh=k;return e},_trans:function(a){this._load(this.file,function(c,e){c?a(c):this._apply(e,a)})},get:function(c){if(a.support.transform){var f=this;"auto"==f.matrix.deg?a.getInfo(this.file,function(a,g){f.matrix.deg= +e[g&&g.exif&&g.exif.Orientation]||0;f._trans(c)}):f._trans(c)}else c("not_support")},toData:function(a){this.get(a)}};j.exifOrientation=e;j.transform=function(c,e,f,q){a.getInfo(c,function(m,k){var y={},r=a.queue(function(a){q(a,y)});m?r.fail():a.each(e,function(a,e){if(!r.isFail()){var l=j(k.nodeType?k:c);if("function"==typeof a)a(k,l);else if(a.width)l[a.preview?"preview":"resize"](a.width,a.height,a.type);else a.maxWidth&&(k.width>a.maxWidth||k.height>a.maxHeight)&&l.resize(a.maxWidth,a.maxHeight, +"max");a.rotate===g&&f&&(a.rotate="auto");l.rotate(a.rotate);r.inc();l.toData(function(d,a){d?r.fail():(y[e]=a,r.next())})}})})};a.support.canvas=a.support.transform=c;a.Image=j})(FileAPI,document); +(function(a,k,g){var j=k.encodeURIComponent,m=k.FormData;k=function(){this.items=[]};k.prototype={append:function(a,c,e,g){this.items.push({name:a,blob:c&&c.blob||(void 0==c?"":c),file:c&&(e||c.name),type:c&&(g||c.type)})},each:function(a){for(var c=0,e=this.items.length;c',c.xhr.abort=function(){var a=e.getElementsByName("iframe")[0];if(a)try{a.stop?a.stop():a.contentWindow.stop?a.contentWindow.stop():a.contentWindow.document.execCommand("Stop")}catch(c){}e=null},j=e.getElementsByTagName("form")[0], +j.appendChild(f),k.log(j.parentNode.innerHTML),document.body.appendChild(e),c.xhr.node=e,a[q]=function(a,f,g){c.readyState=4;c.responseText=g;c.end(a,f);e=null},c.readyState=2,j.submit(),j=null):this.xhr&&this.xhr.aborted?k.log("Error: already aborted"):(e=c.xhr=k.getXHR(),f.params&&(j+=(0>j.indexOf("?")?"?":"&")+f.params.join("&")),e.open("POST",j,!0),k.withCredentials&&(e.withCredentials="true"),(!g.headers||!g.headers["X-Requested-With"])&&e.setRequestHeader("X-Requested-With","XMLHttpRequest"), +k.each(g.headers,function(a,c){e.setRequestHeader(c,a)}),g._chunked?(e.upload&&e.upload.addEventListener("progress",function(a){f.retry||g.progress({type:a.type,total:f.size,loaded:f.start+a.loaded,totalSize:f.size},c,g)},!1),e.onreadystatechange=function(){c.status=e.status;c.statusText=e.statusText;c.readyState=e.readyState;if(4==e.readyState){for(var a in{"":1,XML:1,Text:1,Body:1})c["response"+a]=e["response"+a];e.onreadystatechange=null;if(!e.status||0').replace(/#(\w+)#/ig,function(c,e){return a[e]})},t=function(a,c){if(a&&a.style){var e,f;for(e in c){f=c[e];"number"==typeof f&&(f+="px");try{a.style[e]=f}catch(g){}}}},l=function(d,c){a.each(c,function(a,c){var e=d[c];d[c]=function(){this.parent=e;return a.apply(this,arguments)}})},A=function(d){var c=d.wid=a.uid();p._fn[c]=d;return"FileAPI.Flash._fn."+c}, +u=function(a){try{p._fn[a.wid]=null,delete p._fn[a.wid]}catch(c){}},C=function(a,c){if(!v.test(a)){if(/^\.\//.test(a)||"/"!=a.charAt(0)){var e=location.pathname,e=e.substr(0,e.lastIndexOf("/"));a=(e+"/"+a).replace("/./","/")}"//"!=a.substr(0,2)&&(a="//"+location.host+a);v.test(a)||(a=location.protocol+a)}c&&(a+=(/\?/.test(a)?"&":"?")+c);return a},s=a.uid(),y=0,r={},v=/^https?:/i,p={_fn:{},init:function(){var d=g.body&&g.body.firstChild;if(d){do if(1==d.nodeType){a.log("FlashAPI.Flash.init...");var c= +g.createElement("div");t(c,{top:1,right:1,width:5,height:5,position:"absolute"});d.parentNode.insertBefore(c,d);p.publish(c,s);return}while(d=d.nextSibling)}10>y&&setTimeout(p.init,50*++y)},publish:function(d,c){d.innerHTML=q({id:c,src:C(a.flashUrl,"r="+a.version),wmode:"transparent",flashvars:"callback=FileAPI.Flash.event&flashId="+c+"&storeKey="+navigator.userAgent.match(/\d/ig).join("")+"_"+a.version+(p.isReady||(a.pingUrl?"&ping="+a.pingUrl:""))})},ready:function(){p.ready=a.F;p.isReady=!0;p.patch(); +a.event.on(g,"mouseover",p.mouseover);a.event.on(g,"click",function(a){p.mouseover(a)&&(a.preventDefault?a.preventDefault():a.returnValue=!0)})},getWrapper:function(a){do if(/js-fileapi-wrapper/.test(a.className))return a;while((a=a.parentNode)&&a!==g.body)},mouseover:function(d){d=a.event.fix(d).target;if(/input/i.test(d.nodeName)&&"file"==d.type){var c=d.getAttribute(s);if("i"==c||"r"==c)return!1;if("p"!=c){d.setAttribute(s,"i");var c=g.createElement("div"),e=p.getWrapper(d);if(!e){a.log("flash.mouseover.error: js-fileapi-wrapper not found"); +return}t(c,{top:0,left:0,width:d.offsetWidth+100,height:d.offsetHeight+100,zIndex:"1000000",position:"absolute"});e.appendChild(c);p.publish(c,a.uid());d.setAttribute(s,"p")}return!0}},event:function(d){var c=d.type;if("ready"==c){try{p.getInput(d.flashId).setAttribute(s,"r")}catch(e){}p.ready();setTimeout(function(){p.mouseenter(d)},50);return!0}"ping"===c?a.log("(flash -> js).ping:",[d.status,d.savedStatus],d.error):"log"===c?a.log("(flash -> js).log:",d.target):c in p&&setTimeout(function(){a.log("Flash.event."+ +d.type+":",d);p[c](d)},1)},mouseenter:function(d){var c=p.getInput(d.flashId);if(c){p.cmd(d,"multiple",null!=c.getAttribute("multiple"));var e=[],f={};a.each((c.getAttribute("accept")||"").split(/,\s*/),function(d){a.accept[d]&&a.each(a.accept[d].split(" "),function(a){f[a]=1})});a.each(f,function(a,d){e.push(d)});p.cmd(d,"accept",e.length?e.join(",")+","+e.join(",").toUpperCase():"*")}},get:function(a){return g[a]||k[a]||g.embeds[a]},getInput:function(d){try{var c=p.getWrapper(p.get(d));if(c)return c.getElementsByTagName("input")[0]}catch(e){a.log('Can not find "input" by flashId:', +d,e)}},select:function(d){var c=p.getInput(d.flashId),e=a.uid(c);d=d.target.files;a.each(d,function(d){a.checkFileObj(d)});r[e]=d;g.createEvent?(e=g.createEvent("Event"),e.initEvent("change",!0,!1),c.dispatchEvent(e)):g.createEventObject&&(e=g.createEventObject(),c.fireEvent("onchange",e))},cmd:function(d,c,e,f){try{return a.log("(js -> flash)."+c+":",e),p.get(d.flashId||d).cmd(c,e)}catch(g){a.log("(js -> flash).onError:",g),f||setTimeout(function(){p.cmd(d,c,e,!0)},50)}},patch:function(){a.flashEngine= +a.support.transform=!0;l(a,{getFiles:function(d,c,e){if(e)return a.filterFiles(a.getFiles(d),c,e),null;var f=a.isArray(d)?d:r[a.uid(d.target||d.srcElement||d)];if(!f)return this.parent.apply(this,arguments);c&&(c=a.getFilesFilter(c),f=a.filter(f,function(a){return c.test(a.name)}));return f},getInfo:function(d,c){if(d&&!d.flashId)this.parent.apply(this,arguments);else{if(!d.__info){var e=d.__info=a.defer();p.cmd(d,"getFileInfo",{id:d.id,callback:A(function F(a,c){u(F);e.resolve(a,d.info=c)})})}d.__info.then(c)}}}); +a.support.transform=!0;a.Image&&l(a.Image.prototype,{get:function(a,c){this.set({scaleMode:c||"noScale"});this.parent(a)},_load:function(d,c){a.log("FileAPI.Image._load:",d);if(d&&!d.flashId)this.parent.apply(this,arguments);else{var e=this;a.getInfo(d,function(a){c.call(e,a,d)})}},_apply:function(d,c){a.log("FileAPI.Image._apply:",d);if(d&&!d.flashId)this.parent.apply(this,arguments);else{var e=this.getMatrix(d.info);p.cmd(d,"imageTransform",{id:d.id,matrix:e,callback:A(function F(f,k){a.log("FileAPI.Image._apply.callback:", +f);u(F);if(f)c(f);else if(!a.support.dataURI||3E4 + * @version 1.1.10 + */ +if (window.XMLHttpRequest) { + if (window.FormData) { + // allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934 + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + xhr.send = (function(orig) { + return function() { + if (arguments[0] instanceof FormData && arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + orig.apply(xhr, arguments); + } + })(xhr.send); + return xhr; + } + })(XMLHttpRequest); + } +} diff --git a/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js b/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js new file mode 100644 index 0000000..64d9182 --- /dev/null +++ b/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +window.XMLHttpRequest&&window.FormData&&(XMLHttpRequest=function(a){return function(){var b=new a;return b.send=function(a){return function(){if(arguments[0]instanceof FormData&&arguments[0].__setXHR_){var c=arguments[0];c.__setXHR_(b)}a.apply(b,arguments)}}(b.send),b}}(XMLHttpRequest)); \ No newline at end of file diff --git a/common/resources/lib/fileupload/angular-file-upload-shim.js b/common/resources/lib/fileupload/angular-file-upload-shim.js new file mode 100644 index 0000000..f526e58 --- /dev/null +++ b/common/resources/lib/fileupload/angular-file-upload-shim.js @@ -0,0 +1,215 @@ +/**! + * AngularJS file upload shim for HTML5 FormData + * @author Danial + * @version 1.1.10 + */ +(function() { + +if (window.XMLHttpRequest) { + if (window.FormData) { + // allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934 + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + xhr.send = (function(orig) { + return function() { + if (arguments[0] instanceof FormData && arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + orig.apply(xhr, arguments); + } + })(xhr.send); + return xhr; + } + })(XMLHttpRequest); + } else { + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + var origSend = xhr.send; + xhr.__requestHeaders = []; + xhr.open = (function(orig) { + xhr.upload = { + addEventListener: function(t, fn, b) { + if (t == 'progress') { + xhr.__progress = fn; + } + } + }; + return function(m, url, b) { + orig.apply(xhr, [m, url, b]); + xhr.__url = url; + } + })(xhr.open); + xhr.getResponseHeader = (function(orig) { + return function(h) { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.getResponseHeader(h) : orig.apply(xhr, [h]); + } + })(xhr.getResponseHeader); + xhr.getAllResponseHeaders = (function(orig) { + return function() { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.getAllResponseHeaders() : orig.apply(xhr); + } + })(xhr.getAllResponseHeaders); + xhr.abort = (function(orig) { + return function() { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.abort() : (orig == null ? null : orig.apply(xhr)); + } + })(xhr.abort); + xhr.send = function() { + if (arguments[0] != null && arguments[0].__isShim && arguments[0].__setXHR_) { + var formData = arguments[0]; + if (arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + var config = { + url: xhr.__url, + complete: function(err, fileApiXHR) { + Object.defineProperty(xhr, 'status', {get: function() {return fileApiXHR.status}}); + Object.defineProperty(xhr, 'statusText', {get: function() {return fileApiXHR.statusText}}); + Object.defineProperty(xhr, 'readyState', {get: function() {return 4}}); + Object.defineProperty(xhr, 'response', {get: function() {return fileApiXHR.response}}); + Object.defineProperty(xhr, 'responseText', {get: function() {return fileApiXHR.responseText}}); + xhr.__fileApiXHR = fileApiXHR; + xhr.onreadystatechange(); + }, + progress: function(e) { + xhr.__progress(e); + }, + headers: xhr.__requestHeaders + } + config.data = {}; + config.files = {} + for (var i = 0; i < formData.data.length; i++) { + var item = formData.data[i]; + if (item.val != null && item.val.name != null && item.val.size != null && item.val.type != null) { + config.files[item.key] = item.val; + } else { + config.data[item.key] = item.val; + } + } + + setTimeout(function() { + xhr.__fileApiXHR = FileAPI.upload(config); + }, 1); + } else { + origSend.apply(xhr, arguments); + } + } + return xhr; + } + })(XMLHttpRequest); + } +} + +if (!window.FormData) { + var hasFlash = false; + try { + var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); + if (fo) hasFlash = true; + } catch(e) { + if (navigator.mimeTypes["application/x-shockwave-flash"] != undefined) hasFlash = true; + } + var wrapFileApi = function(elem) { + if (!elem.__isWrapped && (elem.getAttribute('ng-file-select') != null || elem.getAttribute('data-ng-file-select') != null)) { + var wrap = document.createElement('div'); + wrap.innerHTML = '
      '; + wrap = wrap.firstChild; + var parent = elem.parentNode; + parent.insertBefore(wrap, elem); + parent.removeChild(elem); + wrap.appendChild(elem); + if (!hasFlash) { + wrap.appendChild(document.createTextNode('Flash is required')); + } + elem.__isWrapped = true; + } + }; + var changeFnWrapper = function(fn) { + return function(evt) { + var files = FileAPI.getFiles(evt); + if (!evt.target) { + evt.target = {}; + } + evt.target.files = files; + evt.target.files.item = function(i) { + return evt.target.files[i] || null; + } + fn(evt); + }; + }; + var isFileChange = function(elem, e) { + return (e.toLowerCase() === 'change' || e.toLowerCase() === 'onchange') && elem.getAttribute('type') == 'file'; + } + if (HTMLInputElement.prototype.addEventListener) { + HTMLInputElement.prototype.addEventListener = (function(origAddEventListener) { + return function(e, fn, b, d) { + if (isFileChange(this, e)) { + wrapFileApi(this); + origAddEventListener.apply(this, [e, changeFnWrapper(fn), b, d]); + } else { + origAddEventListener.apply(this, [e, fn, b, d]); + } + } + })(HTMLInputElement.prototype.addEventListener); + } + if (HTMLInputElement.prototype.attachEvent) { + HTMLInputElement.prototype.attachEvent = (function(origAttachEvent) { + return function(e, fn) { + if (isFileChange(this, e)) { + wrapFileApi(this); + origAttachEvent.apply(this, [e, changeFnWrapper(fn)]); + } else { + origAttachEvent.apply(this, [e, fn]); + } + } + })(HTMLInputElement.prototype.attachEvent); + } + + window.FormData = FormData = function() { + return { + append: function(key, val, name) { + this.data.push({ + key: key, + val: val, + name: name + }); + }, + data: [], + __isShim: true + }; + }; + + (function () { + //load FileAPI + if (!window.FileAPI || !FileAPI.upload) { + var base = '', script = document.createElement('script'), allScripts = document.getElementsByTagName('script'), i, index, src; + if (window.FileAPI && window.FileAPI.jsPath) { + base = window.FileAPI.jsPath; + } else { + for (i = 0; i < allScripts.length; i++) { + src = allScripts[i].src; + index = src.indexOf('angular-file-upload-shim.js') + if (index == -1) { + index = src.indexOf('angular-file-upload-shim.min.js'); + } + if (index > -1) { + base = src.substring(0, index); + break; + } + } + } + + if (!window.FileAPI || FileAPI.staticPath == null) { + FileAPI = { + staticPath: base + } + } + + script.setAttribute('src', base + "FileAPI.min.js"); + document.getElementsByTagName('head')[0].appendChild(script); + } + })(); +}})(); \ No newline at end of file diff --git a/common/resources/lib/fileupload/angular-file-upload-shim.min.js b/common/resources/lib/fileupload/angular-file-upload-shim.min.js new file mode 100644 index 0000000..e76e175 --- /dev/null +++ b/common/resources/lib/fileupload/angular-file-upload-shim.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +!function(){if(window.XMLHttpRequest&&(XMLHttpRequest=window.FormData?function(a){return function(){var b=new a;return b.send=function(a){return function(){if(arguments[0]instanceof FormData&&arguments[0].__setXHR_){var c=arguments[0];c.__setXHR_(b)}a.apply(b,arguments)}}(b.send),b}}(XMLHttpRequest):function(a){return function(){var b=new a,c=b.send;return b.__requestHeaders=[],b.open=function(a){return b.upload={addEventListener:function(a,c){"progress"==a&&(b.__progress=c)}},function(c,d,e){a.apply(b,[c,d,e]),b.__url=d}}(b.open),b.getResponseHeader=function(a){return function(c){return b.__fileApiXHR?b.__fileApiXHR.getResponseHeader(c):a.apply(b,[c])}}(b.getResponseHeader),b.getAllResponseHeaders=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.getAllResponseHeaders():a.apply(b)}}(b.getAllResponseHeaders),b.abort=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.abort():null==a?null:a.apply(b)}}(b.abort),b.send=function(){if(null!=arguments[0]&&arguments[0].__isShim&&arguments[0].__setXHR_){var a=arguments[0];if(arguments[0].__setXHR_){var a=arguments[0];a.__setXHR_(b)}var d={url:b.__url,complete:function(a,c){Object.defineProperty(b,"status",{get:function(){return c.status}}),Object.defineProperty(b,"statusText",{get:function(){return c.statusText}}),Object.defineProperty(b,"readyState",{get:function(){return 4}}),Object.defineProperty(b,"response",{get:function(){return c.response}}),Object.defineProperty(b,"responseText",{get:function(){return c.responseText}}),b.__fileApiXHR=c,b.onreadystatechange()},progress:function(a){b.__progress(a)},headers:b.__requestHeaders};d.data={},d.files={};for(var e=0;e',c=c.firstChild;var d=b.parentNode;d.insertBefore(c,b),d.removeChild(b),c.appendChild(b),a||c.appendChild(document.createTextNode("Flash is required")),b.__isWrapped=!0}},e=function(a){return function(b){var c=FileAPI.getFiles(b);b.target||(b.target={}),b.target.files=c,b.target.files.item=function(a){return b.target.files[a]||null},a(b)}},f=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,g,h){f(this,b)?(d(this),a.apply(this,[b,e(c),g,h])):a.apply(this,[b,c,g,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){f(this,b)?(d(this),a.apply(this,[b,e(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){this.data.push({key:a,val:b,name:c})},data:[],__isShim:!0}},function(){if(!window.FileAPI||!FileAPI.upload){var a,b,c,d="",e=document.createElement("script"),f=document.getElementsByTagName("script");if(window.FileAPI&&window.FileAPI.jsPath)d=window.FileAPI.jsPath;else for(a=0;a-1){d=c.substring(0,b);break}window.FileAPI&&null!=FileAPI.staticPath||(FileAPI={staticPath:d}),e.setAttribute("src",d+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(e)}}()}}(); \ No newline at end of file diff --git a/common/resources/lib/fileupload/angular-file-upload.js b/common/resources/lib/fileupload/angular-file-upload.js new file mode 100644 index 0000000..0daaa69 --- /dev/null +++ b/common/resources/lib/fileupload/angular-file-upload.js @@ -0,0 +1,156 @@ +/**! + * AngularJS file upload/drop directive with http post and progress + * @author Danial + * @version 1.1.10 + */ +(function() { + +var angularFileUpload = angular.module('angularFileUpload', []); + +angularFileUpload.service('$upload', ['$http', '$rootScope', '$timeout', function($http, $rootScope, $timeout) { + this.upload = function(config) { + config.method = config.method || 'POST'; + config.headers = config.headers || {}; + config.headers['Content-Type'] = undefined; + config.transformRequest = config.transformRequest || $http.defaults.transformRequest; + var formData = new FormData(); + if (config.data) { + for (var key in config.data) { + var val = config.data[key]; + if (!config.formDataAppender) { + if (typeof config.transformRequest == 'function') { + val = config.transformRequest(val); + } else { + for (var i = 0; i < config.transformRequest.length; i++) { + var fn = config.transformRequest[i]; + if (typeof fn == 'function') { + val = fn(val); + } + } + } + formData.append(key, val); + } else { + config.formDataAppender(formData, key, val); + } + } + } + config.transformRequest = angular.identity; + formData.append(config.fileFormDataName || 'file', config.file, config.file.name); + + formData['__setXHR_'] = function(xhr) { + config.__XHR = xhr; + xhr.upload.addEventListener('progress', function(e) { + if (config.progress) { + $timeout(function() { + config.progress(e); + }); + } + }, false); + //fix for firefox not firing upload progress end + xhr.upload.addEventListener('load', function(e) { + if (e.lengthComputable) { + $timeout(function() { + config.progress(e); + }); + } + }, false); + }; + + config.data = formData; + + var promise = $http(config); + + promise.progress = function(fn) { + config.progress = fn; + return promise; + }; + + promise.abort = function() { + if (config.__XHR) { + $timeout(function() { + config.__XHR.abort(); + }); + } + return promise; + }; + promise.then = (function(promise, origThen) { + return function(s, e, p) { + config.progress = p || config.progress; + origThen.apply(promise, [s, e, p]); + return promise; + }; + })(promise, promise.then); + + return promise; + }; +}]); + +angularFileUpload.directive('ngFileSelect', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + var fn = $parse(attr['ngFileSelect']); + elem.bind('change', function(evt) { + var files = [], fileList, i; + fileList = evt.target.files; + if (fileList != null) { + for (i = 0; i < fileList.length; i++) { + files.push(fileList.item(i)); + } + } + $timeout(function() { + fn(scope, { + $files : files, + $event : evt + }); + }); + }); + elem.bind('click', function(){ + this.value = null; + }); + }; +} ]); + +angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + if ('draggable' in document.createElement('span')) { + var fn = $parse(attr['ngFileDropAvailable']); + $timeout(function() { + fn(scope); + }); + } + }; +} ]); + +angularFileUpload.directive('ngFileDrop', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + if ('draggable' in document.createElement('span')) { + var fn = $parse(attr['ngFileDrop']); + elem[0].addEventListener("dragover", function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + elem.addClass(attr['ngFileDragOverClass'] || "dragover"); + }, false); + elem[0].addEventListener("dragleave", function(evt) { + elem.removeClass(attr['ngFileDragOverClass'] || "dragover"); + }, false); + elem[0].addEventListener("drop", function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + elem.removeClass(attr['ngFileDragOverClass'] || "dragover"); + var files = [], fileList = evt.dataTransfer.files, i; + if (fileList != null) { + for (i = 0; i < fileList.length; i++) { + files.push(fileList.item(i)); + } + } + $timeout(function() { + fn(scope, { + $files : files, + $event : evt + }); + }); + }, false); + } + }; +} ]); + +})(); diff --git a/common/resources/lib/fileupload/angular-file-upload.min.js b/common/resources/lib/fileupload/angular-file-upload.min.js new file mode 100644 index 0000000..ae51b1f --- /dev/null +++ b/common/resources/lib/fileupload/angular-file-upload.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +!function(){var a=angular.module("angularFileUpload",[]);a.service("$upload",["$http","$rootScope","$timeout",function(a,b,c){this.upload=function(b){b.method=b.method||"POST",b.headers=b.headers||{},b.headers["Content-Type"]=void 0,b.transformRequest=b.transformRequest||a.defaults.transformRequest;var d=new FormData;if(b.data)for(var e in b.data){var f=b.data[e];if(b.formDataAppender)b.formDataAppender(d,e,f);else{if("function"==typeof b.transformRequest)f=b.transformRequest(f);else for(var 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 literal 0 HcmV?d00001 diff --git a/common/resources/lib/ui-ace/ace.js b/common/resources/lib/ui-ace/ace.js new file mode 100644 index 0000000..2cd6463 --- /dev/null +++ b/common/resources/lib/ui-ace/ace.js @@ -0,0 +1,18673 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Distributed under the BSD license: + * + * Copyright (c) 2010, Ajax.org B.V. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Ajax.org B.V. 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 AJAX.ORG B.V. 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. + * + * ***** END LICENSE BLOCK ***** */ + +/** + * Define a module along with a payload + * @param module a name for the payload + * @param payload a function to call with (require, exports, module) params + */ + +(function() { + +var ACE_NAMESPACE = "ace"; + +var global = (function() { return this; })(); +if (!global && typeof window != "undefined") global = window; // strict mode + + +if (!ACE_NAMESPACE && typeof requirejs !== "undefined") + return; + + +var define = function(module, deps, payload) { + if (typeof module !== "string") { + if (define.original) + define.original.apply(this, arguments); + else { + console.error("dropping module because define wasn\'t a string."); + console.trace(); + } + return; + } + if (arguments.length == 2) + payload = deps; + if (!define.modules[module]) { + define.payloads[module] = payload; + define.modules[module] = null; + } +}; + +define.modules = {}; +define.payloads = {}; + +/** + * Get at functionality define()ed using the function above + */ +var _require = function(parentId, module, callback) { + if (typeof module === "string") { + var payload = lookup(parentId, module); + if (payload != undefined) { + callback && callback(); + return payload; + } + } else if (Object.prototype.toString.call(module) === "[object Array]") { + var params = []; + for (var i = 0, l = module.length; i < l; ++i) { + var dep = lookup(parentId, module[i]); + if (dep == undefined && require.original) + return; + params.push(dep); + } + return callback && callback.apply(null, params) || true; + } +}; + +var require = function(module, callback) { + var packagedModule = _require("", module, callback); + if (packagedModule == undefined && require.original) + return require.original.apply(this, arguments); + return packagedModule; +}; + +var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = base + "/" + moduleName; + + while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + return moduleName; +}; + +/** + * Internal function to lookup moduleNames and resolve them by calling the + * definition function if needed. + */ +var lookup = function(parentId, moduleName) { + moduleName = normalizeModule(parentId, moduleName); + + var module = define.modules[moduleName]; + if (!module) { + module = define.payloads[moduleName]; + if (typeof module === 'function') { + var exports = {}; + var mod = { + id: moduleName, + uri: '', + exports: exports, + packaged: true + }; + + var req = function(module, callback) { + return _require(moduleName, module, callback); + }; + + var returnValue = module(req, exports, mod); + exports = returnValue || mod.exports; + define.modules[moduleName] = exports; + delete define.payloads[moduleName]; + } + module = define.modules[moduleName] = exports || module; + } + return module; +}; + +function exportAce(ns) { + var root = global; + if (ns) { + if (!global[ns]) + global[ns] = {}; + root = global[ns]; + } + + if (!root.define || !root.define.packaged) { + define.original = root.define; + root.define = define; + root.define.packaged = true; + } + + if (!root.require || !root.require.packaged) { + require.original = root.require; + root.require = require; + root.require.packaged = true; + } +} + +exportAce(ACE_NAMESPACE); + +})(); + +ace.define("ace/lib/regexp",["require","exports","module"], function(require, exports, module) { +"use strict"; + + var real = { + exec: RegExp.prototype.exec, + test: RegExp.prototype.test, + match: String.prototype.match, + replace: String.prototype.replace, + split: String.prototype.split + }, + compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups + compliantLastIndexIncrement = function () { + var x = /^/g; + real.test.call(x, ""); + return !x.lastIndex; + }(); + + if (compliantLastIndexIncrement && compliantExecNpcg) + return; + RegExp.prototype.exec = function (str) { + var match = real.exec.apply(this, arguments), + name, r2; + if ( typeof(str) == 'string' && match) { + if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { + r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); + real.replace.call(str.slice(match.index), r2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) + match[i] = undefined; + } + }); + } + if (this._xregexp && this._xregexp.captureNames) { + for (var i = 1; i < match.length; i++) { + name = this._xregexp.captureNames[i - 1]; + if (name) + match[name] = match[i]; + } + } + if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + } + return match; + }; + if (!compliantLastIndexIncrement) { + RegExp.prototype.test = function (str) { + var match = real.exec.call(this, str); + if (match && this.global && !match[0].length && (this.lastIndex > match.index)) + this.lastIndex--; + return !!match; + }; + } + + function getNativeFlags (regex) { + return (regex.global ? "g" : "") + + (regex.ignoreCase ? "i" : "") + + (regex.multiline ? "m" : "") + + (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 + (regex.sticky ? "y" : ""); + } + + function indexOf (array, item, from) { + if (Array.prototype.indexOf) // Use the native array method if available + return array.indexOf(item, from); + for (var i = from || 0; i < array.length; i++) { + if (array[i] === item) + return i; + } + return -1; + } + +}); + +ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { + +function Empty() {} + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + var target = this; + if (typeof target != "function") { + throw new TypeError("Function.prototype.bind called on incompatible " + target); + } + var args = slice.call(arguments, 1); // for normal call + var bound = function () { + + if (this instanceof bound) { + + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + if(target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; +} +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var _toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} +if ([1,2].splice(0).length != 2) { + if(function() { // test IE < 9 to splice bug - see issue #138 + function makeArray(l) { + var a = new Array(l+2); + a[0] = a[1] = 0; + return a; + } + var array = [], lengthBefore; + + array.splice.apply(array, makeArray(20)); + array.splice.apply(array, makeArray(26)); + + lengthBefore = array.length; //46 + array.splice(5, 0, "XXX"); // add one element + + lengthBefore + 1 == array.length + + if (lengthBefore + 1 == array.length) { + return true;// has right splice implementation without bugs + } + }()) {//IE 6/7 + var array_splice = Array.prototype.splice; + Array.prototype.splice = function(start, deleteCount) { + if (!arguments.length) { + return []; + } else { + return array_splice.apply(this, [ + start === void 0 ? 0 : start, + deleteCount === void 0 ? (this.length - start) : deleteCount + ].concat(slice.call(arguments, 2))) + } + }; + } else {//IE8 + Array.prototype.splice = function(pos, removeCount){ + var length = this.length; + if (pos > 0) { + if (pos > length) + pos = length; + } else if (pos == void 0) { + pos = 0; + } else if (pos < 0) { + pos = Math.max(length + pos, 0); + } + + if (!(pos+removeCount < length)) + removeCount = length - pos; + + var removed = this.slice(pos, pos+removeCount); + var insert = slice.call(arguments, 2); + var add = insert.length; + if (pos === length) { + if (add) { + this.push.apply(this, insert); + } + } else { + var remove = Math.min(removeCount, length - pos); + var tailOldPos = pos + remove; + var tailNewPos = tailOldPos + add - remove; + var tailCount = length - tailOldPos; + var lengthAfterRemove = length - remove; + + if (tailNewPos < tailOldPos) { // case A + for (var i = 0; i < tailCount; ++i) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { // case B + for (i = tailCount; i--; ) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } // else, add == remove (nothing to do) + + if (add && pos === lengthAfterRemove) { + this.length = lengthAfterRemove; // truncate array + this.push.apply(this, insert); + } else { + this.length = lengthAfterRemove + add; // reserves space + for (i = 0; i < add; ++i) { + this[pos+i] = insert[i]; + } + } + } + return removed; + }; + } +} +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return _toString(obj) == "[object Array]"; + }; +} +var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + fun.call(thisp, self[i], i, object); + } + } + }; +} +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = [], + value, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (fun.call(thisp, value, i, object)) { + result.push(value); + } + } + } + return result; + }; +} +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; +} +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, object)) { + return true; + } + } + return false; + }; +} +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduce of empty array with no initial value"); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + if (++i >= length) { + throw new TypeError("reduce of empty array with no initial value"); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = fun.call(void 0, result, self[i], i, object); + } + } + + return result; + }; +} +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + if (--i < 0) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + } while (true); + } + + do { + if (i in this) { + result = fun.call(void 0, result, self[i], i, object); + } + } while (i--); + + return result; + }; +} +if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} +if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = Math.min(i, toInteger(arguments[1])); + } + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) { + return i; + } + } + return -1; + }; +} +if (!Object.getPrototypeOf) { + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + descriptor = { enumerable: true, configurable: true }; + if (supportsAccessors) { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + return descriptor; + } + } + descriptor.value = object[property]; + return descriptor; + }; +} +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} +if (!Object.create) { + var createEmpty; + if (Object.prototype.__proto__ === null) { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + createEmpty = function () { + var empty = {}; + for (var i in empty) + empty[i] = null; + empty.constructor = + empty.hasOwnProperty = + empty.propertyIsEnumerable = + empty.isPrototypeOf = + empty.toLocaleString = + empty.toString = + empty.valueOf = + empty.__proto__ = null; + return empty; + } + } + + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + } +} +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + } + } + if (owns(descriptor, "value")) { + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + delete object[property]; + object[property] = descriptor.value; + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} +if (!Object.seal) { + Object.seal = function seal(object) { + return object; + }; +} +if (!Object.freeze) { + Object.freeze = function freeze(object) { + return object; + }; +} +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + return object; + }; +} +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} +if (!Object.keys) { + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) { + hasDontEnumBug = false; + } + + Object.keys = function keys(object) { + + if ( + (typeof object != "object" && typeof object != "function") || + object === null + ) { + throw new TypeError("Object.keys called on a non-object"); + } + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + return keys; + }; + +} +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); +} + +function toPrimitive(input) { + var val, valueOf, toString; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (typeof valueOf === "function") { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toString = input.toString; + if (typeof toString === "function") { + val = toString.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); +} +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert "+o+" to object"); + } + return Object(o); +}; + +}); + +ace.define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"], function(require, exports, module) { +"use strict"; + +require("./regexp"); +require("./es5-shim"); + +}); + +ace.define("ace/lib/dom",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var XHTML_NS = "http://www.w3.org/1999/xhtml"; + +exports.getDocumentHead = function(doc) { + if (!doc) + doc = document; + return doc.head || doc.getElementsByTagName("head")[0] || doc.documentElement; +}; + +exports.createElement = function(tag, ns) { + return document.createElementNS ? + document.createElementNS(ns || XHTML_NS, tag) : + document.createElement(tag); +}; + +exports.hasCssClass = function(el, name) { + var classes = (el.className || "").split(/\s+/g); + return classes.indexOf(name) !== -1; +}; +exports.addCssClass = function(el, name) { + if (!exports.hasCssClass(el, name)) { + el.className += " " + name; + } +}; +exports.removeCssClass = function(el, name) { + var classes = el.className.split(/\s+/g); + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + classes.splice(index, 1); + } + el.className = classes.join(" "); +}; + +exports.toggleCssClass = function(el, name) { + var classes = el.className.split(/\s+/g), add = true; + while (true) { + var index = classes.indexOf(name); + if (index == -1) { + break; + } + add = false; + classes.splice(index, 1); + } + if (add) + classes.push(name); + + el.className = classes.join(" "); + return add; +}; +exports.setCssClass = function(node, className, include) { + if (include) { + exports.addCssClass(node, className); + } else { + exports.removeCssClass(node, className); + } +}; + +exports.hasCssString = function(id, doc) { + var index = 0, sheets; + doc = doc || document; + + if (doc.createStyleSheet && (sheets = doc.styleSheets)) { + while (index < sheets.length) + if (sheets[index++].owningElement.id === id) return true; + } else if ((sheets = doc.getElementsByTagName("style"))) { + while (index < sheets.length) + if (sheets[index++].id === id) return true; + } + + return false; +}; + +exports.importCssString = function importCssString(cssText, id, doc) { + doc = doc || document; + if (id && exports.hasCssString(id, doc)) + return null; + + var style; + + if (id) + cssText += "\n/*# sourceURL=ace/css/" + id + " */"; + + if (doc.createStyleSheet) { + style = doc.createStyleSheet(); + style.cssText = cssText; + if (id) + style.owningElement.id = id; + } else { + style = exports.createElement("style"); + style.appendChild(doc.createTextNode(cssText)); + if (id) + style.id = id; + + exports.getDocumentHead(doc).appendChild(style); + } +}; + +exports.importCssStylsheet = function(uri, doc) { + if (doc.createStyleSheet) { + doc.createStyleSheet(uri); + } else { + var link = exports.createElement('link'); + link.rel = 'stylesheet'; + link.href = uri; + + exports.getDocumentHead(doc).appendChild(link); + } +}; + +exports.getInnerWidth = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingLeft"), 10) + + parseInt(exports.computedStyle(element, "paddingRight"), 10) + + element.clientWidth + ); +}; + +exports.getInnerHeight = function(element) { + return ( + parseInt(exports.computedStyle(element, "paddingTop"), 10) + + parseInt(exports.computedStyle(element, "paddingBottom"), 10) + + element.clientHeight + ); +}; + +exports.scrollbarWidth = function(document) { + var inner = exports.createElement("ace_inner"); + inner.style.width = "100%"; + inner.style.minWidth = "0px"; + inner.style.height = "200px"; + inner.style.display = "block"; + + var outer = exports.createElement("ace_outer"); + var style = outer.style; + + style.position = "absolute"; + style.left = "-10000px"; + style.overflow = "hidden"; + style.width = "200px"; + style.minWidth = "0px"; + style.height = "150px"; + style.display = "block"; + + outer.appendChild(inner); + + var body = document.documentElement; + body.appendChild(outer); + + var noScrollbar = inner.offsetWidth; + + style.overflow = "scroll"; + var withScrollbar = inner.offsetWidth; + + if (noScrollbar == withScrollbar) { + withScrollbar = outer.clientWidth; + } + + body.removeChild(outer); + + return noScrollbar-withScrollbar; +}; + +if (typeof document == "undefined") { + exports.importCssString = function() {}; + return; +} + +if (window.pageYOffset !== undefined) { + exports.getPageScrollTop = function() { + return window.pageYOffset; + }; + + exports.getPageScrollLeft = function() { + return window.pageXOffset; + }; +} +else { + exports.getPageScrollTop = function() { + return document.body.scrollTop; + }; + + exports.getPageScrollLeft = function() { + return document.body.scrollLeft; + }; +} + +if (window.getComputedStyle) + exports.computedStyle = function(element, style) { + if (style) + return (window.getComputedStyle(element, "") || {})[style] || ""; + return window.getComputedStyle(element, "") || {}; + }; +else + exports.computedStyle = function(element, style) { + if (style) + return element.currentStyle[style]; + return element.currentStyle; + }; +exports.setInnerHtml = function(el, innerHtml) { + var element = el.cloneNode(false);//document.createElement("div"); + element.innerHTML = innerHtml; + el.parentNode.replaceChild(element, el); + return element; +}; + +if ("textContent" in document.documentElement) { + exports.setInnerText = function(el, innerText) { + el.textContent = innerText; + }; + + exports.getInnerText = function(el) { + return el.textContent; + }; +} +else { + exports.setInnerText = function(el, innerText) { + el.innerText = innerText; + }; + + exports.getInnerText = function(el) { + return el.innerText; + }; +} + +exports.getParentWindow = function(document) { + return document.defaultView || document.parentWindow; +}; + +}); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/lib/keys",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +require("./fixoldbrowsers"); + +var oop = require("./oop"); +var Keys = (function() { + var ret = { + MODIFIER_KEYS: { + 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta' + }, + + KEY_MODS: { + "ctrl": 1, "alt": 2, "option" : 2, "shift": 4, + "super": 8, "meta": 8, "command": 8, "cmd": 8 + }, + + FUNCTION_KEYS : { + 8 : "Backspace", + 9 : "Tab", + 13 : "Return", + 19 : "Pause", + 27 : "Esc", + 32 : "Space", + 33 : "PageUp", + 34 : "PageDown", + 35 : "End", + 36 : "Home", + 37 : "Left", + 38 : "Up", + 39 : "Right", + 40 : "Down", + 44 : "Print", + 45 : "Insert", + 46 : "Delete", + 96 : "Numpad0", + 97 : "Numpad1", + 98 : "Numpad2", + 99 : "Numpad3", + 100: "Numpad4", + 101: "Numpad5", + 102: "Numpad6", + 103: "Numpad7", + 104: "Numpad8", + 105: "Numpad9", + '-13': "NumpadEnter", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 144: "Numlock", + 145: "Scrolllock" + }, + + PRINTABLE_KEYS: { + 32: ' ', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', + 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', + 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', + 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', + 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', + 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' + } + }; + var name, i; + for (i in ret.FUNCTION_KEYS) { + name = ret.FUNCTION_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + for (i in ret.PRINTABLE_KEYS) { + name = ret.PRINTABLE_KEYS[i].toLowerCase(); + ret[name] = parseInt(i, 10); + } + oop.mixin(ret, ret.MODIFIER_KEYS); + oop.mixin(ret, ret.PRINTABLE_KEYS); + oop.mixin(ret, ret.FUNCTION_KEYS); + ret.enter = ret["return"]; + ret.escape = ret.esc; + ret.del = ret["delete"]; + ret[173] = '-'; + + (function() { + var mods = ["cmd", "ctrl", "alt", "shift"]; + for (var i = Math.pow(2, mods.length); i--;) { + ret.KEY_MODS[i] = mods.filter(function(x) { + return i & ret.KEY_MODS[x]; + }).join("-") + "-"; + } + })(); + + ret.KEY_MODS[0] = ""; + ret.KEY_MODS[-1] = "input-"; + + return ret; +})(); +oop.mixin(exports, Keys); + +exports.keyCodeToString = function(keyCode) { + var keyString = Keys[keyCode]; + if (typeof keyString != "string") + keyString = String.fromCharCode(keyCode); + return keyString.toLowerCase(); +}; + +}); + +ace.define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.OS = { + LINUX: "LINUX", + MAC: "MAC", + WINDOWS: "WINDOWS" +}; +exports.getOS = function() { + if (exports.isMac) { + return exports.OS.MAC; + } else if (exports.isLinux) { + return exports.OS.LINUX; + } else { + return exports.OS.WINDOWS; + } +}; +if (typeof navigator != "object") + return; + +var os = (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase(); +var ua = navigator.userAgent; +exports.isWin = (os == "win"); +exports.isMac = (os == "mac"); +exports.isLinux = (os == "linux"); +exports.isIE = + (navigator.appName == "Microsoft Internet Explorer" || navigator.appName.indexOf("MSAppHost") >= 0) + ? parseFloat((ua.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]) + : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie + +exports.isOldIE = exports.isIE && exports.isIE < 9; +exports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === "Gecko"; +exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\:(\d+)/)||[])[1], 10) < 4; +exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]"; +exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; + +exports.isChrome = parseFloat(ua.split(" Chrome/")[1]) || undefined; + +exports.isAIR = ua.indexOf("AdobeAIR") >= 0; + +exports.isIPad = ua.indexOf("iPad") >= 0; + +exports.isTouchPad = ua.indexOf("TouchPad") >= 0; + +exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; + +}); + +ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keys = require("./keys"); +var useragent = require("./useragent"); + +var pressedKeys = null; +var ts = 0; + +exports.addListener = function(elem, type, callback) { + if (elem.addEventListener) { + return elem.addEventListener(type, callback, false); + } + if (elem.attachEvent) { + var wrapper = function() { + callback.call(elem, window.event); + }; + callback._wrapper = wrapper; + elem.attachEvent("on" + type, wrapper); + } +}; + +exports.removeListener = function(elem, type, callback) { + if (elem.removeEventListener) { + return elem.removeEventListener(type, callback, false); + } + if (elem.detachEvent) { + elem.detachEvent("on" + type, callback._wrapper || callback); + } +}; +exports.stopEvent = function(e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; + +exports.stopPropagation = function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; +}; + +exports.preventDefault = function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; +}; +exports.getButton = function(e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) + return 2; + if (e.preventDefault) { + return e.button; + } + else { + return {1:0, 2:2, 4:1}[e.button]; + } +}; + +exports.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); + + exports.removeListener(document, "mousemove", eventHandler, true); + exports.removeListener(document, "mouseup", onMouseUp, true); + exports.removeListener(document, "dragstart", onMouseUp, true); + } + + exports.addListener(document, "mousemove", eventHandler, true); + exports.addListener(document, "mouseup", onMouseUp, true); + exports.addListener(document, "dragstart", onMouseUp, true); + + return onMouseUp; +}; + +exports.addTouchMoveListener = function (el, callback) { + if ("ontouchmove" in el) { + var startx, starty; + exports.addListener(el, "touchstart", function (e) { + var touchObj = e.changedTouches[0]; + startx = touchObj.clientX; + starty = touchObj.clientY; + }); + exports.addListener(el, "touchmove", function (e) { + var factor = 1, + touchObj = e.changedTouches[0]; + + e.wheelX = -(touchObj.clientX - startx) / factor; + e.wheelY = -(touchObj.clientY - starty) / factor; + + startx = touchObj.clientX; + starty = touchObj.clientY; + + callback(e); + }); + } +}; + +exports.addMouseWheelListener = function(el, callback) { + if ("onmousewheel" in el) { + exports.addListener(el, "mousewheel", function(e) { + var factor = 8; + if (e.wheelDeltaX !== undefined) { + e.wheelX = -e.wheelDeltaX / factor; + e.wheelY = -e.wheelDeltaY / factor; + } else { + e.wheelX = 0; + e.wheelY = -e.wheelDelta / factor; + } + callback(e); + }); + } else if ("onwheel" in el) { + exports.addListener(el, "wheel", function(e) { + var factor = 0.35; + switch (e.deltaMode) { + case e.DOM_DELTA_PIXEL: + e.wheelX = e.deltaX * factor || 0; + e.wheelY = e.deltaY * factor || 0; + break; + case e.DOM_DELTA_LINE: + case e.DOM_DELTA_PAGE: + e.wheelX = (e.deltaX || 0) * 5; + e.wheelY = (e.deltaY || 0) * 5; + break; + } + + callback(e); + }); + } else { + exports.addListener(el, "DOMMouseScroll", function(e) { + if (e.axis && e.axis == e.HORIZONTAL_AXIS) { + e.wheelX = (e.detail || 0) * 5; + e.wheelY = 0; + } else { + e.wheelX = 0; + e.wheelY = (e.detail || 0) * 5; + } + callback(e); + }); + } +}; + +exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" + }; + + function onMousedown(e) { + if (exports.getButton(e) !== 0) { + clicks = 0; + } else if (e.detail > 1) { + clicks++; + if (clicks > 4) + clicks = 1; + } else { + clicks = 1; + } + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; + } + } + + e._clicks = clicks; + + eventHandler[callbackName]("mousedown", e); + + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + function onDblclick(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function(el) { + exports.addListener(el, "mousedown", onMousedown); + if (useragent.isOldIE) + exports.addListener(el, "dblclick", onDblclick); + }); +}; + +var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window) + ? function(e) { + return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); + } + : function(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); + }; + +exports.getModifierString = function(e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; + +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + + if (!useragent.isMac && pressedKeys) { + if (pressedKeys.OSKey) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else + return; + } + if (keyCode === 18 || keyCode === 17) { + var location = "location" in e ? e.location : e.keyLocation; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) { + keyCode = -1; + } + + if (!hashId && keyCode === 13) { + var location = "location" in e ? e.location : e.keyLocation; + if (location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) + return; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + + return callback(e, hashId, keyCode); +} + + +exports.addCommandKeyListener = function(el, callback) { + var addListener = exports.addListener; + if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { + var lastKeyDownKeyCode = null; + addListener(el, "keydown", function(e) { + lastKeyDownKeyCode = e.keyCode; + }); + addListener(el, "keypress", function(e) { + return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); + }); + } else { + var lastDefaultPrevented = null; + + addListener(el, "keydown", function(e) { + var keyCode = e.keyCode; + pressedKeys[keyCode] = (pressedKeys[keyCode] || 0) + 1; + if (keyCode == 91 || keyCode == 92) { + pressedKeys.OSKey = true; + } else if (pressedKeys.OSKey) { + if (e.timeStamp - pressedKeys.lastT > 200 && pressedKeys.count == 1) + resetPressedKeys(); + } + if (pressedKeys[keyCode] == 1) + pressedKeys.count++; + pressedKeys.lastT = e.timeStamp; + var result = normalizeCommandKeys(callback, e, keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }); + + addListener(el, "keypress", function(e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }); + + addListener(el, "keyup", function(e) { + var keyCode = e.keyCode; + if (!pressedKeys[keyCode]) { + resetPressedKeys(); + } else { + pressedKeys.count = Math.max(pressedKeys.count - 1, 0); + } + if (keyCode == 91 || keyCode == 92) { + pressedKeys.OSKey = false; + } + pressedKeys[keyCode] = null; + }); + + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); + pressedKeys.count = 0; + pressedKeys.lastT = 0; +} + +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + postMessageId; + exports.addListener(win, "message", function listener(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + exports.removeListener(win, "message", listener); + callback(); + } + }); + win.postMessage(messageName, "*"); + }; +} + + +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + || window.msRequestAnimationFrame + || window.oRequestAnimationFrame); + +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function(callback) { + setTimeout(callback, 17); + }; +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i 1); + return ev.preventDefault(); + }; + + this.startSelect = function(pos, waitForClickSelection) { + pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); + var editor = this.editor; + editor.$blockScrolling++; + if (this.mousedownEvent.getShiftKey()) + editor.selection.selectToPosition(pos); + else if (!waitForClickSelection) + editor.selection.moveToPosition(pos); + if (!waitForClickSelection) + this.select(); + if (editor.renderer.scroller.setCapture) { + editor.renderer.scroller.setCapture(); + } + editor.setStyle("ace_selecting"); + this.setState("select"); + editor.$blockScrolling--; + }; + + this.select = function() { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + editor.$blockScrolling++; + if (this.$clickSelection) { + var cmp = this.$clickSelection.comparePoint(cursor); + + if (cmp == -1) { + anchor = this.$clickSelection.end; + } else if (cmp == 1) { + anchor = this.$clickSelection.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.$blockScrolling--; + editor.renderer.scrollCursorIntoView(); + }; + + this.extendSelectionBy = function(unitName) { + var anchor, editor = this.editor; + var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); + var range = editor.selection[unitName](cursor.row, cursor.column); + editor.$blockScrolling++; + if (this.$clickSelection) { + var cmpStart = this.$clickSelection.comparePoint(range.start); + var cmpEnd = this.$clickSelection.comparePoint(range.end); + + if (cmpStart == -1 && cmpEnd <= 0) { + anchor = this.$clickSelection.end; + if (range.end.row != cursor.row || range.end.column != cursor.column) + cursor = range.start; + } else if (cmpEnd == 1 && cmpStart >= 0) { + anchor = this.$clickSelection.start; + if (range.start.row != cursor.row || range.start.column != cursor.column) + cursor = range.end; + } else if (cmpStart == -1 && cmpEnd == 1) { + cursor = range.end; + anchor = range.start; + } else { + var orientedRange = calcRangeOrientation(this.$clickSelection, cursor); + cursor = orientedRange.cursor; + anchor = orientedRange.anchor; + } + editor.selection.setSelectionAnchor(anchor.row, anchor.column); + } + editor.selection.selectToPosition(cursor); + editor.$blockScrolling--; + editor.renderer.scrollCursorIntoView(); + }; + + this.selectEnd = + this.selectAllEnd = + this.selectByWordsEnd = + this.selectByLinesEnd = function() { + this.$clickSelection = null; + this.editor.unsetStyle("ace_selecting"); + if (this.editor.renderer.scroller.releaseCapture) { + this.editor.renderer.scroller.releaseCapture(); + } + }; + + this.focusWait = function() { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + var time = Date.now(); + + if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout) + this.startSelect(this.mousedownEvent.getDocumentPosition()); + }; + + this.onDoubleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + var session = editor.session; + + var range = session.getBracketRange(pos); + if (range) { + if (range.isEmpty()) { + range.start.column--; + range.end.column++; + } + this.setState("select"); + } else { + range = editor.selection.getWordRange(pos.row, pos.column); + this.setState("selectByWords"); + } + this.$clickSelection = range; + this.select(); + }; + + this.onTripleClick = function(ev) { + var pos = ev.getDocumentPosition(); + var editor = this.editor; + + this.setState("selectByLines"); + var range = editor.getSelectionRange(); + if (range.isMultiLine() && range.contains(pos.row, pos.column)) { + this.$clickSelection = editor.selection.getLineRange(range.start.row); + this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; + } else { + this.$clickSelection = editor.selection.getLineRange(pos.row); + } + this.select(); + }; + + this.onQuadClick = function(ev) { + var editor = this.editor; + + editor.selectAll(); + this.$clickSelection = editor.getSelectionRange(); + this.setState("selectAll"); + }; + + this.onMouseWheel = function(ev) { + if (ev.getAccelKey()) + return; + if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) { + ev.wheelX = ev.wheelY; + ev.wheelY = 0; + } + + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime||0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + + this.onTouchMove = function (ev) { + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime || 0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; + +}).call(DefaultHandlers.prototype); + +exports.DefaultHandlers = DefaultHandlers; + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +function calcRangeOrientation(range, cursor) { + if (range.start.row == range.end.row) + var cmp = 2 * cursor.column - range.start.column - range.end.column; + else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column) + var cmp = cursor.column - 4; + else + var cmp = 2 * cursor.row - range.start.row - range.end.row; + + if (cmp < 0) + return {cursor: range.start, anchor: range.end}; + else + return {cursor: range.end, anchor: range.start}; +} + +}); + +ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +function Tooltip (parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; +} + +(function() { + this.$init = function() { + this.$element = dom.createElement("div"); + this.$element.className = "ace_tooltip"; + this.$element.style.display = "none"; + this.$parentNode.appendChild(this.$element); + return this.$element; + }; + this.getElement = function() { + return this.$element || this.$init(); + }; + this.setText = function(text) { + dom.setInnerText(this.getElement(), text); + }; + this.setHtml = function(html) { + this.getElement().innerHTML = html; + }; + this.setPosition = function(x, y) { + this.getElement().style.left = x + "px"; + this.getElement().style.top = y + "px"; + }; + this.setClassName = function(className) { + dom.addCssClass(this.getElement(), className); + }; + this.show = function(text, x, y) { + if (text != null) + this.setText(text); + if (x != null && y != null) + this.setPosition(x, y); + if (!this.isOpen) { + this.getElement().style.display = "block"; + this.isOpen = true; + } + }; + + this.hide = function() { + if (this.isOpen) { + this.getElement().style.display = "none"; + this.isOpen = false; + } + }; + this.getHeight = function() { + return this.getElement().offsetHeight; + }; + this.getWidth = function() { + return this.getElement().offsetWidth; + }; + +}).call(Tooltip.prototype); + +exports.Tooltip = Tooltip; +}); + +ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { +"use strict"; +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var event = require("../lib/event"); +var Tooltip = require("../tooltip").Tooltip; + +function GutterHandler(mouseHandler) { + var editor = mouseHandler.editor; + var gutter = editor.renderer.$gutterLayer; + var tooltip = new GutterTooltip(editor.container); + + mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { + if (!editor.isFocused() || e.getButton() != 0) + return; + var gutterRegion = gutter.getRegion(e); + + if (gutterRegion == "foldWidgets") + return; + + var row = e.getDocumentPosition().row; + var selection = editor.session.selection; + + if (e.getShiftKey()) + selection.selectTo(row, 0); + else { + if (e.domEvent.detail == 2) { + editor.selectAll(); + return e.preventDefault(); + } + mouseHandler.$clickSelection = editor.selection.getLineRange(row); + } + mouseHandler.setState("selectByLines"); + mouseHandler.captureMouse(e); + return e.preventDefault(); + }); + + + var tooltipTimeout, mouseEvent, tooltipAnnotation; + + function showTooltip() { + var row = mouseEvent.getDocumentPosition().row; + var annotation = gutter.$annotations[row]; + if (!annotation) + return hideTooltip(); + + var maxRow = editor.session.getLength(); + if (row == maxRow) { + var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row; + var pos = mouseEvent.$pos; + if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column)) + return hideTooltip(); + } + + if (tooltipAnnotation == annotation) + return; + tooltipAnnotation = annotation.text.join("
      "); + + tooltip.setHtml(tooltipAnnotation); + tooltip.show(); + editor.on("mousewheel", hideTooltip); + + if (mouseHandler.$tooltipFollowsMouse) { + moveTooltip(mouseEvent); + } else { + var gutterElement = mouseEvent.domEvent.target; + var rect = gutterElement.getBoundingClientRect(); + var style = tooltip.getElement().style; + style.left = rect.right + "px"; + style.top = rect.bottom + "px"; + } + } + + function hideTooltip() { + if (tooltipTimeout) + tooltipTimeout = clearTimeout(tooltipTimeout); + if (tooltipAnnotation) { + tooltip.hide(); + tooltipAnnotation = null; + editor.removeEventListener("mousewheel", hideTooltip); + } + } + + function moveTooltip(e) { + tooltip.setPosition(e.x, e.y); + } + + mouseHandler.editor.setDefaultHandler("guttermousemove", function(e) { + var target = e.domEvent.target || e.domEvent.srcElement; + if (dom.hasCssClass(target, "ace_fold-widget")) + return hideTooltip(); + + if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse) + moveTooltip(e); + + mouseEvent = e; + if (tooltipTimeout) + return; + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + if (mouseEvent && !mouseHandler.isMousePressed) + showTooltip(); + else + hideTooltip(); + }, 50); + }); + + event.addListener(editor.renderer.$gutter, "mouseout", function(e) { + mouseEvent = null; + if (!tooltipAnnotation || tooltipTimeout) + return; + + tooltipTimeout = setTimeout(function() { + tooltipTimeout = null; + hideTooltip(); + }, 50); + }); + + editor.on("changeSession", hideTooltip); +} + +function GutterTooltip(parentNode) { + Tooltip.call(this, parentNode); +} + +oop.inherits(GutterTooltip, Tooltip); + +(function(){ + this.setPosition = function(x, y) { + var windowWidth = window.innerWidth || document.documentElement.clientWidth; + var windowHeight = window.innerHeight || document.documentElement.clientHeight; + var width = this.getWidth(); + var height = this.getHeight(); + x += 15; + y += 15; + if (x + width > windowWidth) { + x -= (x + width) - windowWidth; + } + if (y + height > windowHeight) { + y -= 20 + height; + } + Tooltip.prototype.setPosition.call(this, x, y); + }; + +}).call(GutterTooltip.prototype); + + + +exports.GutterHandler = GutterHandler; + +}); + +ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +var MouseEvent = exports.MouseEvent = function(domEvent, editor) { + this.domEvent = domEvent; + this.editor = editor; + + this.x = this.clientX = domEvent.clientX; + this.y = this.clientY = domEvent.clientY; + + this.$pos = null; + this.$inSelection = null; + + this.propagationStopped = false; + this.defaultPrevented = false; +}; + +(function() { + + this.stopPropagation = function() { + event.stopPropagation(this.domEvent); + this.propagationStopped = true; + }; + + this.preventDefault = function() { + event.preventDefault(this.domEvent); + this.defaultPrevented = true; + }; + + this.stop = function() { + this.stopPropagation(); + this.preventDefault(); + }; + this.getDocumentPosition = function() { + if (this.$pos) + return this.$pos; + + this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY); + return this.$pos; + }; + this.inSelection = function() { + if (this.$inSelection !== null) + return this.$inSelection; + + var editor = this.editor; + + + var selectionRange = editor.getSelectionRange(); + if (selectionRange.isEmpty()) + this.$inSelection = false; + else { + var pos = this.getDocumentPosition(); + this.$inSelection = selectionRange.contains(pos.row, pos.column); + } + + return this.$inSelection; + }; + this.getButton = function() { + return event.getButton(this.domEvent); + }; + this.getShiftKey = function() { + return this.domEvent.shiftKey; + }; + + this.getAccelKey = useragent.isMac + ? function() { return this.domEvent.metaKey; } + : function() { return this.domEvent.ctrlKey; }; + +}).call(MouseEvent.prototype); + +}); + +ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); + +var AUTOSCROLL_DELAY = 200; +var SCROLL_CURSOR_DELAY = 200; +var SCROLL_CURSOR_HYSTERESIS = 5; + +function DragdropHandler(mouseHandler) { + + var editor = mouseHandler.editor; + + var blankImage = dom.createElement("img"); + blankImage.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (useragent.isOpera) + blankImage.style.cssText = "width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;"; + + var exports = ["dragWait", "dragWaitEnd", "startDrag", "dragReadyEnd", "onMouseDrag"]; + + exports.forEach(function(x) { + mouseHandler[x] = this[x]; + }, this); + editor.addEventListener("mousedown", this.onMouseDown.bind(mouseHandler)); + + + var mouseTarget = editor.container; + var dragSelectionMarker, x, y; + var timerId, range; + var dragCursor, counter = 0; + var dragOperation; + var isInternal; + var autoScrollStartTime; + var cursorMovedTime; + var cursorPointOnCaretMoved; + + this.onDragStart = function(e) { + if (this.cancelDrag || !mouseTarget.draggable) { + var self = this; + setTimeout(function(){ + self.startSelect(); + self.captureMouse(e); + }, 0); + return e.preventDefault(); + } + range = editor.getSelectionRange(); + + var dataTransfer = e.dataTransfer; + dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; + if (useragent.isOpera) { + editor.container.appendChild(blankImage); + blankImage.scrollTop = 0; + } + dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0); + if (useragent.isOpera) { + editor.container.removeChild(blankImage); + } + dataTransfer.clearData(); + dataTransfer.setData("Text", editor.session.getTextRange()); + + isInternal = true; + this.setState("drag"); + }; + + this.onDragEnd = function(e) { + mouseTarget.draggable = false; + isInternal = false; + this.setState(null); + if (!editor.getReadOnly()) { + var dropEffect = e.dataTransfer.dropEffect; + if (!dragOperation && dropEffect == "move") + editor.session.remove(editor.getSelectionRange()); + editor.renderer.$cursorLayer.setBlinking(true); + } + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + }; + + this.onDragEnter = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) + addDragMarker(); + counter++; + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragOver = function(e) { + if (editor.getReadOnly() || !canAccept(e.dataTransfer)) + return; + x = e.clientX; + y = e.clientY; + if (!dragSelectionMarker) { + addDragMarker(); + counter++; + } + if (onMouseMoveTimer !== null) + onMouseMoveTimer = null; + + e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); + return event.preventDefault(e); + }; + + this.onDragLeave = function(e) { + counter--; + if (counter <= 0 && dragSelectionMarker) { + clearDragMarker(); + dragOperation = null; + return event.preventDefault(e); + } + }; + + this.onDrop = function(e) { + if (!dragCursor) + return; + var dataTransfer = e.dataTransfer; + if (isInternal) { + switch (dragOperation) { + case "move": + if (range.contains(dragCursor.row, dragCursor.column)) { + range = { + start: dragCursor, + end: dragCursor + }; + } else { + range = editor.moveText(range, dragCursor); + } + break; + case "copy": + range = editor.moveText(range, dragCursor, true); + break; + } + } else { + var dropData = dataTransfer.getData('Text'); + range = { + start: dragCursor, + end: editor.session.insert(dragCursor, dropData) + }; + editor.focus(); + dragOperation = null; + } + clearDragMarker(); + return event.preventDefault(e); + }; + + event.addListener(mouseTarget, "dragstart", this.onDragStart.bind(mouseHandler)); + event.addListener(mouseTarget, "dragend", this.onDragEnd.bind(mouseHandler)); + event.addListener(mouseTarget, "dragenter", this.onDragEnter.bind(mouseHandler)); + event.addListener(mouseTarget, "dragover", this.onDragOver.bind(mouseHandler)); + event.addListener(mouseTarget, "dragleave", this.onDragLeave.bind(mouseHandler)); + event.addListener(mouseTarget, "drop", this.onDrop.bind(mouseHandler)); + + function scrollCursorIntoView(cursor, prevCursor) { + var now = Date.now(); + var vMovement = !prevCursor || cursor.row != prevCursor.row; + var hMovement = !prevCursor || cursor.column != prevCursor.column; + if (!cursorMovedTime || vMovement || hMovement) { + editor.$blockScrolling += 1; + editor.moveCursorToPosition(cursor); + editor.$blockScrolling -= 1; + cursorMovedTime = now; + cursorPointOnCaretMoved = {x: x, y: y}; + } else { + var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y); + if (distance > SCROLL_CURSOR_HYSTERESIS) { + cursorMovedTime = null; + } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) { + editor.renderer.scrollCursorIntoView(); + cursorMovedTime = null; + } + } + } + + function autoScroll(cursor, prevCursor) { + var now = Date.now(); + var lineHeight = editor.renderer.layerConfig.lineHeight; + var characterWidth = editor.renderer.layerConfig.characterWidth; + var editorRect = editor.renderer.scroller.getBoundingClientRect(); + var offsets = { + x: { + left: x - editorRect.left, + right: editorRect.right - x + }, + y: { + top: y - editorRect.top, + bottom: editorRect.bottom - y + } + }; + var nearestXOffset = Math.min(offsets.x.left, offsets.x.right); + var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom); + var scrollCursor = {row: cursor.row, column: cursor.column}; + if (nearestXOffset / characterWidth <= 2) { + scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2); + } + if (nearestYOffset / lineHeight <= 1) { + scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1); + } + var vScroll = cursor.row != scrollCursor.row; + var hScroll = cursor.column != scrollCursor.column; + var vMovement = !prevCursor || cursor.row != prevCursor.row; + if (vScroll || (hScroll && !vMovement)) { + if (!autoScrollStartTime) + autoScrollStartTime = now; + else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY) + editor.renderer.scrollCursorIntoView(scrollCursor); + } else { + autoScrollStartTime = null; + } + } + + function onDragInterval() { + var prevCursor = dragCursor; + dragCursor = editor.renderer.screenToTextCoordinates(x, y); + scrollCursorIntoView(dragCursor, prevCursor); + autoScroll(dragCursor, prevCursor); + } + + function addDragMarker() { + range = editor.selection.toOrientedRange(); + dragSelectionMarker = editor.session.addMarker(range, "ace_selection", editor.getSelectionStyle()); + editor.clearSelection(); + if (editor.isFocused()) + editor.renderer.$cursorLayer.setBlinking(false); + clearInterval(timerId); + onDragInterval(); + timerId = setInterval(onDragInterval, 20); + counter = 0; + event.addListener(document, "mousemove", onMouseMove); + } + + function clearDragMarker() { + clearInterval(timerId); + editor.session.removeMarker(dragSelectionMarker); + dragSelectionMarker = null; + editor.$blockScrolling += 1; + editor.selection.fromOrientedRange(range); + editor.$blockScrolling -= 1; + if (editor.isFocused() && !isInternal) + editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly()); + range = null; + dragCursor = null; + counter = 0; + autoScrollStartTime = null; + cursorMovedTime = null; + event.removeListener(document, "mousemove", onMouseMove); + } + var onMouseMoveTimer = null; + function onMouseMove() { + if (onMouseMoveTimer == null) { + onMouseMoveTimer = setTimeout(function() { + if (onMouseMoveTimer != null && dragSelectionMarker) + clearDragMarker(); + }, 20); + } + } + + function canAccept(dataTransfer) { + var types = dataTransfer.types; + return !types || Array.prototype.some.call(types, function(type) { + return type == 'text/plain' || type == 'Text'; + }); + } + + function getDropEffect(e) { + var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized']; + var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized']; + + var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey; + var effectAllowed = "uninitialized"; + try { + effectAllowed = e.dataTransfer.effectAllowed.toLowerCase(); + } catch (e) {} + var dropEffect = "none"; + + if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + else if (moveAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "move"; + else if (copyAllowed.indexOf(effectAllowed) >= 0) + dropEffect = "copy"; + + return dropEffect; + } +} + +(function() { + + this.dragWait = function() { + var interval = Date.now() - this.mousedownEvent.time; + if (interval > this.editor.getDragDelay()) + this.startDrag(); + }; + + this.dragWaitEnd = function() { + var target = this.editor.container; + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + this.selectEnd(); + }; + + this.dragReadyEnd = function(e) { + this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()); + this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); + this.dragWaitEnd(); + }; + + this.startDrag = function(){ + this.cancelDrag = false; + var editor = this.editor; + var target = editor.container; + target.draggable = true; + editor.renderer.$cursorLayer.setBlinking(false); + editor.setStyle("ace_dragging"); + var cursorStyle = useragent.isWin ? "default" : "move"; + editor.renderer.setCursorStyle(cursorStyle); + this.setState("dragReady"); + }; + + this.onMouseDrag = function(e) { + var target = this.editor.container; + if (useragent.isIE && this.state == "dragReady") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 3) + target.dragDrop(); + } + if (this.state === "dragWait") { + var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y); + if (distance > 0) { + target.draggable = false; + this.startSelect(this.mousedownEvent.getDocumentPosition()); + } + } + }; + + this.onMouseDown = function(e) { + if (!this.$dragEnabled) + return; + this.mousedownEvent = e; + var editor = this.editor; + + var inSelection = e.inSelection(); + var button = e.getButton(); + var clickCount = e.domEvent.detail || 1; + if (clickCount === 1 && button === 0 && inSelection) { + if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey())) + return; + this.mousedownEvent.time = Date.now(); + var eventTarget = e.domEvent.target || e.domEvent.srcElement; + if ("unselectable" in eventTarget) + eventTarget.unselectable = "on"; + if (editor.getDragDelay()) { + if (useragent.isWebKit) { + this.cancelDrag = true; + var mouseTarget = editor.container; + mouseTarget.draggable = true; + } + this.setState("dragWait"); + } else { + this.startDrag(); + } + this.captureMouse(e, this.onMouseDrag.bind(this)); + e.defaultPrevented = true; + } + }; + +}).call(DragdropHandler.prototype); + + +function calcDistance(ax, ay, bx, by) { + return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2)); +} + +exports.DragdropHandler = DragdropHandler; + +}); + +ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; +var dom = require("./dom"); + +exports.get = function (url, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + callback(xhr.responseText); + } + }; + xhr.send(null); +}; + +exports.loadScript = function(path, callback) { + var head = dom.getDocumentHead(); + var s = document.createElement('script'); + + s.src = path; + head.appendChild(s); + + s.onload = s.onreadystatechange = function(_, isAbort) { + if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") { + s = s.onload = s.onreadystatechange = null; + if (!isAbort) + callback(); + } + }; +}; +exports.qualifyURL = function(url) { + var a = document.createElement('a'); + a.href = url; + return a.href; +} + +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); +}; + +exports.setModuleUrl = function(name, subst) { + return options.$moduleUrls[name] = subst; +}; + +exports.$loading = {}; +exports.loadModule = function(moduleName, onLoad) { + var module, moduleType; + if (Array.isArray(moduleName)) { + moduleType = moduleName[0]; + moduleName = moduleName[1]; + } + + try { + module = require(moduleName); + } catch (e) {} + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); +}; +init(true);function init(packaged) { + + if (!global || !global.document) + return; + + options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; + + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = function(session) { + this.session = session; + this.doc = session.getDocument(); + + this.clearSelection(); + this.lead = this.selectionLead = this.doc.createAnchor(0, 0); + this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); + + var self = this; + this.lead.on("change", function(e) { + self._emit("changeCursor"); + if (!self.$isEmpty) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + + this.selectionAnchor.on("change", function() { + if (!self.$isEmpty) + self._emit("changeSelection"); + }); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.isEmpty = function() { + return (this.$isEmpty || ( + this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column + )); + }; + this.isMultiLine = function() { + if (this.isEmpty()) { + return false; + } + + return this.getRange().isMultiLine(); + }; + this.getCursor = function() { + return this.lead.getPosition(); + }; + this.setSelectionAnchor = function(row, column) { + this.anchor.setPosition(row, column); + + if (this.$isEmpty) { + this.$isEmpty = false; + this._emit("changeSelection"); + } + }; + this.getSelectionAnchor = function() { + if (this.$isEmpty) + return this.getSelectionLead(); + else + return this.anchor.getPosition(); + }; + this.getSelectionLead = function() { + return this.lead.getPosition(); + }; + this.shiftSelection = function(columns) { + if (this.$isEmpty) { + this.moveCursorTo(this.lead.row, this.lead.column + columns); + return; + } + + var anchor = this.getSelectionAnchor(); + var lead = this.getSelectionLead(); + + var isBackwards = this.isBackwards(); + + if (!isBackwards || anchor.column !== 0) + this.setSelectionAnchor(anchor.row, anchor.column + columns); + + if (isBackwards || lead.column !== 0) { + this.$moveSelection(function() { + this.moveCursorTo(lead.row, lead.column + columns); + }); + } + }; + this.isBackwards = function() { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + this.getRange = function() { + var anchor = this.anchor; + var lead = this.lead; + + if (this.isEmpty()) + return Range.fromPoints(lead, lead); + + if (this.isBackwards()) { + return Range.fromPoints(lead, anchor); + } + else { + return Range.fromPoints(anchor, lead); + } + }; + this.clearSelection = function() { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + this.selectAll = function() { + var lastRow = this.doc.getLength() - 1; + this.setSelectionAnchor(0, 0); + this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); + }; + this.setRange = + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } + if (this.getRange().isEmpty()) + this.$isEmpty = true; + this.$desiredColumn = null; + }; + + this.$moveSelection = function(mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + + mover.call(this); + }; + this.selectTo = function(row, column) { + this.$moveSelection(function() { + this.moveCursorTo(row, column); + }); + }; + this.selectToPosition = function(pos) { + this.$moveSelection(function() { + this.moveCursorToPosition(pos); + }); + }; + this.moveTo = function(row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + this.moveToPosition = function(pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); + }; + this.selectUp = function() { + this.$moveSelection(this.moveCursorUp); + }; + this.selectDown = function() { + this.$moveSelection(this.moveCursorDown); + }; + this.selectRight = function() { + this.$moveSelection(this.moveCursorRight); + }; + this.selectLeft = function() { + this.$moveSelection(this.moveCursorLeft); + }; + this.selectLineStart = function() { + this.$moveSelection(this.moveCursorLineStart); + }; + this.selectLineEnd = function() { + this.$moveSelection(this.moveCursorLineEnd); + }; + this.selectFileEnd = function() { + this.$moveSelection(this.moveCursorFileEnd); + }; + this.selectFileStart = function() { + this.$moveSelection(this.moveCursorFileStart); + }; + this.selectWordRight = function() { + this.$moveSelection(this.moveCursorWordRight); + }; + this.selectWordLeft = function() { + this.$moveSelection(this.moveCursorWordLeft); + }; + this.getWordRange = function(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { + this.setSelectionRange(this.getWordRange()); + }; + this.selectAWord = function() { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } else { + rowEnd = rowStart; + } + if (excludeLastChar === true) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + this.selectLine = function() { + this.setSelectionRange(this.getLineRange()); + }; + this.moveCursorUp = function() { + this.moveCursorBy(-1, 0); + }; + this.moveCursorDown = function() { + this.moveCursorBy(1, 0); + }; + this.moveCursorLeft = function() { + var cursor = this.lead.getPosition(), + fold; + + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } else if (cursor.column === 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize) + this.moveCursorBy(0, -tabSize); + else + this.moveCursorBy(0, -1); + } + }; + this.moveCursorRight = function() { + var cursor = this.lead.getPosition(), + fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize) + this.moveCursorBy(0, tabSize); + else + this.moveCursorBy(0, 1); + } + }; + this.moveCursorLineStart = function() { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine( + row, null, firstColumnPosition.row, + firstColumnPosition.column + ); + + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + this.moveCursorLineEnd = function() { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + this.moveCursorFileEnd = function() { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + this.moveCursorFileStart = function() { + this.moveCursorTo(0, 0); + }; + this.moveCursorLongWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (match = this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (match = this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + this.moveCursorLongWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column); + } + + var leftOfCursor = lang.stringReverse(str); + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (match = this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (match = this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + + this.$shortWordEndIndex = function(rightOfCursor) { + var match, index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + + tokenRe.lastIndex = 0; + if (match = this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + + if (index < 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index ++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index--; + break; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + if (index > 2) + break; + } + } + } + } + } + tokenRe.lastIndex = 0; + + return index; + }; + + this.moveCursorShortWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row); + } while (row < l && /^\s*$/.test(rightOfCursor)); + + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = ""; + column = 0; + } + + var index = this.$shortWordEndIndex(rightOfCursor); + + this.moveCursorTo(row, column + index); + }; + + this.moveCursorShortWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + + var line = this.session.getLine(row).substring(0, column); + if (column === 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)); + + column = line.length; + if (!/\s+$/.test(line)) + line = ""; + } + + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + + return this.moveCursorTo(row, column - index); + }; + + this.moveCursorWordRight = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + + this.moveCursorWordLeft = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + this.moveCursorBy = function(rows, chars) { + var screenPos = this.session.documentToScreenPosition( + this.lead.row, + this.lead.column + ); + + if (chars === 0) { + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); + + if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { + if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) { + if (docPos.row > 0 || rows > 0) + docPos.row++; + } + } + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + this.moveCursorToPosition = function(position) { + this.moveCursorTo(position.row, position.column); + }; + this.moveCursorTo = function(row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + + this.$keepDesiredColumnOnChange = true; + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + this.detach = function() { + this.lead.detach(); + this.anchor.detach(); + this.session = this.doc = null; + }; + + this.fromOrientedRange = function(range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + }; + + this.toOrientedRange = function(range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } else { + range = r; + } + + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + }; + this.getRangeOfMovements = function(func) { + var start = this.getCursor(); + try { + func(this); + var end = this.getCursor(); + return Range.fromPoints(start,end); + } catch(e) { + return Range.fromPoints(start,start); + } finally { + this.moveCursorToPosition(start); + } + }; + + this.toJSON = function() { + if (this.rangeCount) { + var data = this.ranges.map(function(r) { + var r1 = r.clone(); + r1.isBackwards = r.cursor == r.start; + return r1; + }); + } else { + var data = this.getRange(); + data.isBackwards = this.isBackwards(); + } + return data; + }; + + this.fromJSON = function(data) { + if (data.start == undefined) { + if (this.rangeList) { + this.toSingleRange(data[0]); + for (var i = data.length; i--; ) { + var r = Range.fromPoints(data[i].start, data[i].end); + if (data[i].isBackwards) + r.cursor = r.start; + this.addRange(r, true); + } + return; + } else + data = data[0]; + } + if (this.rangeList) + this.toSingleRange(data); + this.setSelectionRange(data, data.isBackwards); + }; + + this.isEqual = function(data) { + if ((data.length || this.rangeCount) && data.length != this.rangeCount) + return false; + if (!data.length || !this.ranges) + return this.getRange().isEqual(data); + + for (var i = this.ranges.length; i--; ) { + if (!this.ranges[i].isEqual(data[i])) + return false; + } + return true; + }; + +}).call(Selection.prototype); + +exports.Selection = Selection; +}); + +ace.define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { +"use strict"; + +var config = require("./config"); +var MAX_TOKEN_COUNT = 2000; +var Tokenizer = function(rules) { + this.states = rules; + + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; + + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) + continue; + + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + + mapping[matchTotal] = i; + matchTotal += matchcount; + + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + + splitterRurles.forEach(function(rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } +}; + +(function() { + this.$setMaxTokenCount = function(m) { + MAX_TOKEN_COUNT = m | 0; + }; + + this.$applyToken = function(str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{type: types, value: str}]; + + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }; + + this.$arrayTokens = function(str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + + this.removeCapturingGroups = function(src) { + var r = src.replace( + /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, + function(x, y) {return y ? "(?:" : x;} + ); + return r; + }; + + this.createSplitterRegexp = function(src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( + m, esc, parenOpen, parenClose, square, index + ) { + if (inChClass) { + inChClass = square != "]"; + } else if (square) { + inChClass = true; + } else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index+1; + lastCapture.stack = -1; + } + stack--; + } else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack + lastCapture.start = index; + } + } + return m; + }); + + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + if (src.charAt(0) != "^") src = "^" + src; + if (src.charAt(src.length - 1) != "$") src += "$"; + + return new RegExp(src, (flag||"").replace("g", "")); + }; + this.getLineTokens = function(line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + if (startState === "#tmp") { + stack.shift() + startState = stack.shift() + } + } else + var stack = []; + + var currentState = startState || "start"; + var state = this.states[currentState]; + if (!state) { + currentState = "start"; + state = this.states[currentState]; + } + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + + var match, tokens = []; + var lastIndex = 0; + var matchAttempts = 0; + + var token = {type: null, value: ""}; + + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: skipped}; + } + } + + for (var i = 0; i < match.length-2; i++) { + if (match[i + 1] === undefined) + continue; + + rule = state[mapping[i]]; + + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack); + else + type = rule.token; + + if (rule.next) { + if (typeof rule.next == "string") { + currentState = rule.next; + } else { + currentState = rule.next(currentState, stack); + } + + state = this.states[currentState]; + if (!state) { + this.reportError("state doesn't exist", currentState); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + break; + } + + if (value) { + if (typeof type === "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: value}; + } + } else if (type) { + if (token.type) + tokens.push(token); + token = {type: null, value: ""}; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + + if (lastIndex == line.length) + break; + + lastIndex = index; + + if (matchAttempts++ > MAX_TOKEN_COUNT) { + if (matchAttempts > 2 * line.length) { + this.reportError("infinite loop with in ace tokenizer", { + startState: startState, + line: line + }); + } + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 2000), + type: "overflow" + }; + } + currentState = "start"; + stack = []; + break; + } + } + + if (token.type) + tokens.push(token); + + if (stack.length > 1) { + if (stack[0] !== currentState) + stack.unshift("#tmp", currentState); + } + return { + tokens : tokens, + state : stack.length ? stack : currentState + }; + }; + + this.reportError = config.reportError; + +}).call(Tokenizer.prototype); + +exports.Tokenizer = Tokenizer; +}); + +ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); + +var TextHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "empty_line", + regex : '^$' + }, { + defaultToken : "text" + }] + }; +}; + +(function() { + + this.addRules = function(rules, prefix) { + if (!prefix) { + for (var key in rules) + this.$rules[key] = rules[key]; + return; + } + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next || rule.onMatch) { + if (typeof rule.next == "string") { + if (rule.next.indexOf(prefix) !== 0) + rule.next = prefix + rule.next; + } + if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) + rule.nextState = prefix + rule.nextState; + } + } + this.$rules[prefix + key] = state; + } + }; + + this.getRules = function() { + return this.$rules; + }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = typeof HighlightRules == "function" + ? new HighlightRules().getRules() + : HighlightRules; + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + + this.addRules(embedRules, prefix); + + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + } + + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + }; + + this.getEmbeds = function() { + return this.$embeds; + }; + + var pushState = function(currentState, stack) { + if (currentState != "start" || stack.length) + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function(currentState, stack) { + stack.shift(); + return stack.shift() || "start"; + }; + + this.normalizeRules = function() { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state.processed = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } else if (next == "pop") { + rule.next = popState; + } + + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } else { + rules[r] = rule.rules[r]; + } + } + } + if (rule.include || typeof rule == "string") { + var includeName = rule.include || rule; + var toInsert = rules[includeName]; + } else if (Array.isArray(rule)) + toInsert = rule; + + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function(x) {return !x.next;}); + state.splice.apply(state, args); + i--; + toInsert = null; + } + + if (rule.keywordMap) { + rule.token = this.createKeywordMapper( + rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive + ); + delete rule.defaultToken; + } + } + } + Object.keys(rules).forEach(processState, this); + }; + + this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + Object.keys(map).forEach(function(className) { + var a = map[className]; + if (ignoreCase) + a = a.toLowerCase(); + var list = a.split(splitChar || "|"); + for (var i = list.length; i--; ) + keywords[list[i]] = className; + }); + if (Object.getPrototypeOf(keywords)) { + keywords.__proto__ = null; + } + this.$keywordList = Object.keys(keywords); + map = null; + return ignoreCase + ? function(value) {return keywords[value.toLowerCase()] || defaultToken } + : function(value) {return keywords[value] || defaultToken }; + }; + + this.getKeywords = function() { + return this.$keywords; + }; + +}).call(TextHighlightRules.prototype); + +exports.TextHighlightRules = TextHighlightRules; +}); + +ace.define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var Behaviour = function() { + this.$behaviours = {}; +}; + +(function () { + + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + } + + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + } + + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + } + + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + } + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {} + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + } + +}).call(Behaviour.prototype); + +exports.Behaviour = Behaviour; +}); + +ace.define("ace/unicode",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.packages = {}; + +addUnicodePackage({ + L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", + Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A", + Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", + Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F", + Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26", + Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", + Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC", + Me: "0488048906DE20DD-20E020E2-20E4A670-A672", + N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", + No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835", + P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65", + Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D", + Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62", + Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63", + Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20", + Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21", + Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F", + Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65", + S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD", + Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC", + Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6", + Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3", + So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD", + Z: "002000A01680180E2000-200A20282029202F205F3000", + Zs: "002000A01680180E2000-200A202F205F3000", + Zl: "2028", + Zp: "2029", + C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF", + Cc: "0000-001F007F-009F", + Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB", + Co: "E000-F8FF", + Cs: "D800-DFFF", + Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF" +}); + +function addUnicodePackage (pack) { + var codePoint = /\w{4}/g; + for (var name in pack) + exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); +} + +}); + +ace.define("ace/token_iterator",["require","exports","module"], function(require, exports, module) { +"use strict"; +var TokenIterator = function(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; +}; + +(function() { + this.stepBackward = function() { + this.$tokenIndex -= 1; + + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.stepForward = function() { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = 0; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentToken = function () { + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentTokenRow = function () { + return this.$row; + }; + this.getCurrentTokenColumn = function() { + var rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + + return column; + }; + this.getCurrentTokenPosition = function() { + return {row: this.$row, column: this.getCurrentTokenColumn()}; + }; + +}).call(TokenIterator.prototype); + +exports.TokenIterator = TokenIterator; +}); + +ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var Behaviour = require("./behaviour").Behaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = TextHighlightRules; + this.$behaviour = new Behaviour(); +}; + +(function() { + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]|\\s])+", "g" + ); + + this.getTokenizer = function() { + if (!this.$tokenizer) { + this.$highlightRules = this.$highlightRules || new this.HighlightRules(); + this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); + } + return this.$tokenizer; + }; + + this.lineCommentStart = ""; + this.blockComment = ""; + + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + + var comment = function(line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({row: i, column: line.length}, lineCommentEnd); + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + + var uncomment = function(line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + + var testRemove = function(line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === "comment") + return true; + } + }; + } else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + + insertAtTabStop = session.getUseSoftTabs(); + + var uncomment = function(line, i) { + var m = line.match(regexpStart); + if (!m) return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function(line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + else + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + var testRemove = function(line, i) { + return regexpStart.test(line); + }; + + var shouldInsertSpace = function(line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + return true; + }; + } + + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + + + var minEmptyLength = Infinity; + iter(function(line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + + iter(shouldRemove ? uncomment : comment); + }; + + this.toggleBlockComment = function(state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break; + } + token = iterator.stepBackward(); + } + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length; + } + } else { + colDiff = comment.start.length; + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.autoOutdent = function(state, doc, row) { + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + + this.createWorker = function(session) { + return null; + }; + + this.createModeDelegates = function (mapping) { + this.$embeds = []; + this.$modes = {}; + for (var i in mapping) { + if (mapping[i]) { + this.$embeds.push(i); + this.$modes[i] = new mapping[i](); + } + } + + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this)); + } + }; + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0]; + if (typeof state != "string") + state = state[0]; + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) continue; + + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + + this.transformAction = function(state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + + this.getKeywords = function(append) { + if (!this.completionKeywords) { + var rules = this.$tokenizer.rules; + var completionKeywords = []; + for (var rule in rules) { + var ruleItr = rules[rule]; + for (var r = 0, l = ruleItr.length; r < l; r++) { + if (typeof ruleItr[r].token === "string") { + if (/keyword|support|storage/.test(ruleItr[r].token)) + completionKeywords.push(ruleItr[r].regex); + } + else if (typeof ruleItr[r].token === "object") { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + if (/keyword|support|storage/.test(ruleItr[r].token[a])) { + var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; + completionKeywords.push(rule.substr(1, rule.length - 2)); + } + } + } + } + } + this.completionKeywords = completionKeywords; + } + if (!append) + return this.$keywordList; + return completionKeywords.concat(this.$keywordList || []); + }; + + this.$createKeywordList = function() { + if (!this.$highlightRules) + this.getTokenizer(); + return this.$keywordList = this.$highlightRules.$keywordList || []; + }; + + this.getCompletions = function(state, session, pos, prefix) { + var keywords = this.$keywordList || this.$createKeywordList(); + return keywords.map(function(word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + }); + }; + + this.$id = "ace/mode/text"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + this.getDocument = function() { + return this.document; + }; + this.$insertRight = false; + this.onChange = function(delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + + if (delta.start.row > this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var BackgroundTokenizer = function(tokenizer, editor) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + + var self = this; + + this.$worker = function() { + if (!self.running) { return; } + + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + + var startLine = currentLine; + while (self.lines[currentLine]) + currentLine++; + + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines ++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } + } + self.currentLine = currentLine; + + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setTokenizer = function(tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + + this.start(0); + }; + this.setDocument = function(doc) { + this.doc = doc; + this.lines = []; + this.states = []; + + this.stop(); + }; + this.fireUpdateEvent = function(firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._signal("update", {data: data}); + }; + this.start = function(startRow) { + this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); + this.lines.splice(this.currentLine, this.lines.length); + this.states.splice(this.currentLine, this.states.length); + + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + + this.scheduleStart = function() { + if (!this.running) + this.running = setTimeout(this.$worker, 700); + } + + this.$updateOnChange = function(delta) { + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + this.lines[startRow] = null; + } else if (delta.action == "remove") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + + this.stop(); + }; + this.stop = function() { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + this.getTokens = function(row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + this.getState = function(row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + + this.$tokenizeRow = function(row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + + var data = this.tokenizer.getLineTokens(line, state, row); + + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } else if (this.currentLine == row) { + this.currentLine = row + 1; + } + + return this.lines[row] = data.tokens; + }; + +}).call(BackgroundTokenizer.prototype); + +exports.BackgroundTokenizer = BackgroundTokenizer; +}); + +ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var SearchHighlight = function(regExp, clazz, type) { + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type || "text"; +}; + +(function() { + this.MAX_RANGES = 500; + + this.setRegexp = function(regExp) { + if (this.regExp+"" == regExp+"") + return; + this.regExp = regExp; + this.cache = []; + }; + + this.update = function(html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function(match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + + for (var j = ranges.length; j --; ) { + markerLayer.drawSingleLineMarker( + html, ranges[j].toScreenRange(session), this.clazz, config); + } + } + }; + +}).call(SearchHighlight.prototype); + +exports.SearchHighlight = SearchHighlight; +}); + +ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } else { + folds = this.folds = [ folds ]; + } + + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, + last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + + this.folds.forEach(function(fold) { + fold.setFoldLine(this); + }, this); +} + +(function() { + this.shiftRow = function(shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function(fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + }; + + this.addFold = function(fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function(a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; + }; + + this.containsRow = function(row) { + return row >= this.start.row && row <= this.end.row; + }; + + this.walk = function(callback, endRow, endColumn) { + var lastEnd = 0, + folds = this.folds, + fold, + cmp, stop, isNewRow = true; + + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + }; + + this.getNextFoldTo = function(row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; + } + } + return null; + }; + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + window.console && window.console.log(row, column, fold); + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + }; + + this.split = function(row, column) { + var pos = this.getNextFoldTo(row, column); + + if (!pos || pos.kind == "inside") + return null; + + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + + this.merge = function(foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + }; + + this.toString = function() { + var ret = [this.range.toString() + ": [" ]; + + this.folds.forEach(function(fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); + }; + + this.idxToPosition = function(idx) { + var lastFoldEndColumn = 0; + + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + + lastFoldEndColumn = fold.end.column; + } + + return { + row: this.end.row, + column: this.end.column + idx + }; + }; +}).call(FoldLine.prototype); + +exports.FoldLine = FoldLine; +}); + +ace.define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; + +var RangeList = function() { + this.ranges = []; +}; + +(function() { + this.comparePoints = comparePoints; + + this.pointIndex = function(pos, excludeEdges, startIndex) { + var list = this.ranges; + + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i-2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + + return -i-1; + } + return -i - 1; + }; + + this.add = function(range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + + this.addList = function(list) { + var removed = []; + for (var i = list.length; i--; ) { + removed.push.apply(removed, this.add(list[i])); + } + return removed; + }; + + this.substractPoint = function(pos) { + var i = this.pointIndex(pos); + + if (i >= 0) + return this.ranges.splice(i, 1); + }; + this.merge = function() { + var removed = []; + var list = this.ranges; + + list = list.sort(function(a, b) { + return comparePoints(a.start, b.start); + }); + + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + + this.ranges = list; + + return removed; + }; + + this.contains = function(row, column) { + return this.pointIndex({row: row, column: column}) >= 0; + }; + + this.containsPoint = function(pos) { + return this.pointIndex(pos) >= 0; + }; + + this.rangeAtPoint = function(pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + + + this.clipRows = function(startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + + var startIndex = this.pointIndex({row: startRow, column: 0}); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + + this.removeAll = function() { + return this.ranges.splice(0, this.ranges.length); + }; + + this.attach = function(session) { + if (this.session) + this.detach(); + + this.session = session; + this.onChange = this.$onChange.bind(this); + + this.session.on('change', this.onChange); + }; + + this.detach = function() { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + + this.$onChange = function(delta) { + if (delta.action == "insert"){ + var start = delta.start; + var end = delta.end; + } else { + var end = delta.start; + var start = delta.end; + } + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + + var colDiff = -start.column + end.column; + var ranges = this.ranges; + + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row < startRow) + continue; + if (r.start.row > startRow) + break; + + if (r.start.row == startRow && r.start.column >= start.column ) { + if (r.start.column == start.column && this.$insertRight) { + } else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$insertRight) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + +}).call(RangeList.prototype); + +exports.RangeList = RangeList; +}); + +ace.define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var RangeList = require("../range_list").RangeList; +var oop = require("../lib/oop") +var Fold = exports.Fold = function(range, placeholder) { + this.foldLine = null; + this.placeholder = placeholder; + this.range = range; + this.start = range.start; + this.end = range.end; + + this.sameRow = range.start.row == range.end.row; + this.subFolds = this.ranges = []; +}; + +oop.inherits(Fold, RangeList); + +(function() { + + this.toString = function() { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + + this.setFoldLine = function(foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function(fold) { + fold.setFoldLine(foldLine); + }); + }; + + this.clone = function() { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function(subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + + this.addSubFold = function(fold) { + if (this.range.isEqual(fold)) + return; + + if (!this.range.containsRange(fold)) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + consumeRange(fold, this.start); + + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + + if (cmp == 0) + return afterStart.addSubFold(fold); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + var afterEnd = this.subFolds[j]; + + if (cmp == 0) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + + var consumedFolds = this.subFolds.splice(i, j - i, fold); + fold.setFoldLine(this.foldLine); + + return fold; + }; + + this.restoreRange = function(range) { + return restoreRange(range, this.start); + }; + +}).call(Fold.prototype); + +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} + +}); + +ace.define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; + +function Folding() { + this.getFoldAt = function(row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var fold = folds[i]; + if (fold.range.contains(row, column)) { + if (side == 1 && fold.range.isEnd(row, column)) { + continue; + } else if (side == -1 && fold.range.isStart(row, column)) { + continue; + } + return fold; + } + } + }; + this.getFoldsInRange = function(range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + + start.column += 1; + end.column -= 1; + + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } else if (cmp == 2) { + continue; + } else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + + return foundFolds; + }; + + this.getFoldsInRangeList = function(ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function(range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); + } else { + var folds = this.getFoldsInRange(ranges); + } + return folds; + }; + this.getAllFolds = function() { + var folds = []; + var foldLines = this.$foldData; + + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + + return folds; + }; + this.getFoldStringAt = function(row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + + this.getFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + + this.getFoldedRowCount = function(first, last) { + var foldData = this.$foldData, rowCount = last-first+1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], + end = foldLine.end.row, + start = foldLine.start.row; + if (end >= last) { + if (start < last) { + if (start >= first) + rowCount -= last-start; + else + rowCount = 0; // in one fold + } + break; + } else if (end >= first){ + if (start >= first) // fold inside range + rowCount -= end-start; + else + rowCount -= end-first+1; + } + } + return rowCount; + }; + + this.$addFoldLine = function(foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function(a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function(placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + if (!(startRow < endRow || + startRow == endRow && startColumn <= endColumn - 2)) + throw new Error("The range has to be at least 2 characters width"); + + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + folds.forEach(function(subFold) { + fold.addSubFold(subFold); + }); + } + + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } else if (endRow <= foldLine.start.row) { + break; + } + } + + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + + return fold; + }; + + this.addFolds = function(folds) { + folds.forEach(function(fold) { + this.addFold(fold); + }, this); + }; + + this.removeFold = function(fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); + }; + + this.removeFolds = function(folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + + cloneFolds.forEach(function(fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + + this.expandFold = function(fold) { + this.removeFold(fold); + fold.subFolds.forEach(function(subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); + } + fold.subFolds = []; + }; + + this.expandFolds = function(folds) { + folds.forEach(function(fold) { + this.expandFold(fold); + }, this); + }; + + this.unfold = function(location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + expandInner = true; + } else if (typeof location == "number") + range = new Range(location, 0, location, this.getLine(location).length); + else if ("row" in location) + range = Range.fromPoints(location, location); + else + range = location; + + folds = this.getFoldsInRangeList(range); + if (expandInner) { + this.removeFolds(folds); + } else { + var subFolds = folds; + while (subFolds.length) { + this.expandFolds(subFolds); + subFolds = this.getFoldsInRangeList(range); + } + } + if (folds.length) + return folds; + }; + this.isRowFolded = function(docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + + this.getRowFoldEnd = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + + this.getRowFoldStart = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + + foldLine.walk(function(placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + + if (placeholder != null) { + textLine += placeholder; + } else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } else { + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); + } + }; + + this.$cloneFoldData = function() { + var fd = []; + fd = this.$foldData.map(function(foldLine) { + var folds = foldLine.folds.map(function(fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + + return fd; + }; + + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + + this.addFold(placeholder, range); + }; + + this.getCommentFoldRange = function(row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + if (token && /^comment|string/.test(token.type)) { + var range = new Range(); + var re = new RegExp(token.type.replace(/\..*/, "\\.")); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + iterator.stepForward(); + } + + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + 2; + + iterator = new TokenIterator(this, row, column); + + if (dir != -1) { + do { + token = iterator.stepForward(); + } while (token && re.test(token.type)); + token = iterator.stepBackward(); + } else + token = iterator.getCurrentToken(); + + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; + return range; + } + }; + + this.foldAll = function(startRow, endRow, depth) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow + ) { + row = range.end.row; + try { + var fold = this.addFold("...", range); + if (fold) + fold.collapseChildren = depth; + } catch(e) {} + } + } + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function(style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + + if (this.$foldStyle == style) + return; + + this.$foldStyle = style; + + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + + this.$setFolding = function(foldMode) { + if (this.$foldMode == foldMode) + return; + + this.$foldMode = foldMode; + + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + + return { + range: i !== -1 && range, + firstRange: firstRange + }; + }; + + this.onFoldWidgetClick = function(row, e) { + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; + } + }; + + this.$toggleFoldWidget = function(row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return; + } + + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return; + } + } + + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + + return range; + }; + + + + this.toggleFoldWidget = function(toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + + if (fold) { + this.removeFold(fold); + } else { + this.addFold("...", range); + } + } + }; + + this.updateFoldWidgets = function(delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + + if (len === 0) { + this.foldWidgets[firstRow] = null; + } else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + }; +} + +exports.Folding = Folding; + +}); + +ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + + +function BracketMatch() { + + this.findMatchingBracket = function(position, chr) { + if (position.column == 0) return null; + + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; + + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column-1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + + return range; + }; + + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{" + }; + + this.$findOpeningBracket = function(bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + + while (true) { + + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + value = token.value; + valueIndex = value.length - 1; + } + + return null; + }; + + this.$findClosingBracket = function(bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + + while (true) { + + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + valueIndex = 0; + } + + return null; + }; +} +exports.BracketMatch = BracketMatch; + +}); + +ace.define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var config = require("./config"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Selection = require("./selection").Selection; +var TextMode = require("./mode/text").Mode; +var Range = require("./range").Range; +var Document = require("./document").Document; +var BackgroundTokenizer = require("./background_tokenizer").BackgroundTokenizer; +var SearchHighlight = require("./search_highlight").SearchHighlight; + +var EditSession = function(text, mode) { + this.$breakpoints = []; + this.$decorations = []; + this.$frontMarkers = {}; + this.$backMarkers = {}; + this.$markerId = 1; + this.$undoSelect = true; + + this.$foldData = []; + this.$foldData.toString = function() { + return this.join("\n"); + }; + this.on("changeFold", this.onChangeFold.bind(this)); + this.$onChange = this.onChange.bind(this); + + if (typeof text != "object" || !text.getLine) + text = new Document(text); + + this.setDocument(text); + this.selection = new Selection(this); + + config.resetOptions(this); + this.setMode(mode); + config._signal("session", this); +}; + + +(function() { + + oop.implement(this, EventEmitter); + this.setDocument = function(doc) { + if (this.doc) + this.doc.removeListener("change", this.$onChange); + + this.doc = doc; + doc.on("change", this.$onChange); + + if (this.bgTokenizer) + this.bgTokenizer.setDocument(this.getDocument()); + + this.resetCaches(); + }; + this.getDocument = function() { + return this.doc; + }; + this.$resetRowCache = function(docRow) { + if (!docRow) { + this.$docRowCache = []; + this.$screenRowCache = []; + return; + } + var l = this.$docRowCache.length; + var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1; + if (l > i) { + this.$docRowCache.splice(i, l); + this.$screenRowCache.splice(i, l); + } + }; + + this.$getRowCacheIndex = function(cacheArray, val) { + var low = 0; + var hi = cacheArray.length - 1; + + while (low <= hi) { + var mid = (low + hi) >> 1; + var c = cacheArray[mid]; + + if (val > c) + low = mid + 1; + else if (val < c) + hi = mid - 1; + else + return mid; + } + + return low -1; + }; + + this.resetCaches = function() { + this.$modified = true; + this.$wrapData = []; + this.$rowLengthCache = []; + this.$resetRowCache(0); + if (this.bgTokenizer) + this.bgTokenizer.start(0); + }; + + this.onChangeFold = function(e) { + var fold = e.data; + this.$resetRowCache(fold.start.row); + }; + + this.onChange = function(delta) { + this.$modified = true; + + this.$resetRowCache(delta.start.row); + + var removedFolds = this.$updateInternalDataOnChange(delta); + if (!this.$fromUndo && this.$undoManager && !delta.ignore) { + this.$deltasDoc.push(delta); + if (removedFolds && removedFolds.length != 0) { + this.$deltasFold.push({ + action: "removeFolds", + folds: removedFolds + }); + } + + this.$informUndoManager.schedule(); + } + + this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); + }; + this.setValue = function(text) { + this.doc.setValue(text); + this.selection.moveTo(0, 0); + + this.$resetRowCache(0); + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + this.setUndoManager(this.$undoManager); + this.getUndoManager().reset(); + }; + this.getValue = + this.toString = function() { + return this.doc.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.getState = function(row) { + return this.bgTokenizer.getState(row); + }; + this.getTokens = function(row) { + return this.bgTokenizer.getTokens(row); + }; + this.getTokenAt = function(row, column) { + var tokens = this.bgTokenizer.getTokens(row); + var token, c = 0; + if (column == null) { + i = tokens.length - 1; + c = this.getLine(row).length; + } else { + for (var i = 0; i < tokens.length; i++) { + c += tokens[i].value.length; + if (c >= column) + break; + } + } + token = tokens[i]; + if (!token) + return null; + token.index = i; + token.start = c - token.value.length; + return token; + }; + this.setUndoManager = function(undoManager) { + this.$undoManager = undoManager; + this.$deltas = []; + this.$deltasDoc = []; + this.$deltasFold = []; + + if (this.$informUndoManager) + this.$informUndoManager.cancel(); + + if (undoManager) { + var self = this; + + this.$syncInformUndoManager = function() { + self.$informUndoManager.cancel(); + + if (self.$deltasFold.length) { + self.$deltas.push({ + group: "fold", + deltas: self.$deltasFold + }); + self.$deltasFold = []; + } + + if (self.$deltasDoc.length) { + self.$deltas.push({ + group: "doc", + deltas: self.$deltasDoc + }); + self.$deltasDoc = []; + } + + if (self.$deltas.length > 0) { + undoManager.execute({ + action: "aceupdate", + args: [self.$deltas, self], + merge: self.mergeUndoDeltas + }); + } + self.mergeUndoDeltas = false; + self.$deltas = []; + }; + this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager); + } + }; + this.markUndoGroup = function() { + if (this.$syncInformUndoManager) + this.$syncInformUndoManager(); + }; + + this.$defaultUndoManager = { + undo: function() {}, + redo: function() {}, + reset: function() {} + }; + this.getUndoManager = function() { + return this.$undoManager || this.$defaultUndoManager; + }; + this.getTabString = function() { + if (this.getUseSoftTabs()) { + return lang.stringRepeat(" ", this.getTabSize()); + } else { + return "\t"; + } + }; + this.setUseSoftTabs = function(val) { + this.setOption("useSoftTabs", val); + }; + this.getUseSoftTabs = function() { + return this.$useSoftTabs && !this.$mode.$indentWithTabs; + }; + this.setTabSize = function(tabSize) { + this.setOption("tabSize", tabSize); + }; + this.getTabSize = function() { + return this.$tabSize; + }; + this.isTabStop = function(position) { + return this.$useSoftTabs && (position.column % this.$tabSize === 0); + }; + + this.$overwrite = false; + this.setOverwrite = function(overwrite) { + this.setOption("overwrite", overwrite); + }; + this.getOverwrite = function() { + return this.$overwrite; + }; + this.toggleOverwrite = function() { + this.setOverwrite(!this.$overwrite); + }; + this.addGutterDecoration = function(row, className) { + if (!this.$decorations[row]) + this.$decorations[row] = ""; + this.$decorations[row] += " " + className; + this._signal("changeBreakpoint", {}); + }; + this.removeGutterDecoration = function(row, className) { + this.$decorations[row] = (this.$decorations[row] || "").replace(" " + className, ""); + this._signal("changeBreakpoint", {}); + }; + this.getBreakpoints = function() { + return this.$breakpoints; + }; + this.setBreakpoints = function(rows) { + this.$breakpoints = []; + for (var i=0; i 0) + inToken = !!line.charAt(column - 1).match(this.tokenRe); + + if (!inToken) + inToken = !!line.charAt(column).match(this.tokenRe); + + if (inToken) + var re = this.tokenRe; + else if (/^\s+$/.test(line.slice(column-1, column+1))) + var re = /\s/; + else + var re = this.nonTokenRe; + + var start = column; + if (start > 0) { + do { + start--; + } + while (start >= 0 && line.charAt(start).match(re)); + start++; + } + + var end = column; + while (end < line.length && line.charAt(end).match(re)) { + end++; + } + + return new Range(row, start, row, end); + }; + this.getAWordRange = function(row, column) { + var wordRange = this.getWordRange(row, column); + var line = this.getLine(wordRange.end.row); + + while (line.charAt(wordRange.end.column).match(/[ \t]/)) { + wordRange.end.column += 1; + } + return wordRange; + }; + this.setNewLineMode = function(newLineMode) { + this.doc.setNewLineMode(newLineMode); + }; + this.getNewLineMode = function() { + return this.doc.getNewLineMode(); + }; + this.setUseWorker = function(useWorker) { this.setOption("useWorker", useWorker); }; + this.getUseWorker = function() { return this.$useWorker; }; + this.onReloadTokenizer = function(e) { + var rows = e.data; + this.bgTokenizer.start(rows.first); + this._signal("tokenizerUpdate", e); + }; + + this.$modes = {}; + this.$mode = null; + this.$modeId = null; + this.setMode = function(mode, cb) { + if (mode && typeof mode === "object") { + if (mode.getTokenizer) + return this.$onChangeMode(mode); + var options = mode; + var path = options.path; + } else { + path = mode || "ace/mode/text"; + } + if (!this.$modes["ace/mode/text"]) + this.$modes["ace/mode/text"] = new TextMode(); + + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + cb && cb(); + return; + } + this.$modeId = path; + config.loadModule(["mode", path], function(m) { + if (this.$modeId !== path) + return cb && cb(); + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + } else if (m && m.Mode) { + m = new m.Mode(options); + if (!options) { + this.$modes[path] = m; + m.$id = path; + } + this.$onChangeMode(m); + } + cb && cb(); + }.bind(this)); + if (!this.$mode) + this.$onChangeMode(this.$modes["ace/mode/text"], true); + }; + + this.$onChangeMode = function(mode, $isPlaceholder) { + if (!$isPlaceholder) + this.$modeId = mode.$id; + if (this.$mode === mode) + return; + + this.$mode = mode; + + this.$stopWorker(); + + if (this.$useWorker) + this.$startWorker(); + + var tokenizer = mode.getTokenizer(); + + if(tokenizer.addEventListener !== undefined) { + var onReloadTokenizer = this.onReloadTokenizer.bind(this); + tokenizer.addEventListener("update", onReloadTokenizer); + } + + if (!this.bgTokenizer) { + this.bgTokenizer = new BackgroundTokenizer(tokenizer); + var _self = this; + this.bgTokenizer.addEventListener("update", function(e) { + _self._signal("tokenizerUpdate", e); + }); + } else { + this.bgTokenizer.setTokenizer(tokenizer); + } + + this.bgTokenizer.setDocument(this.getDocument()); + + this.tokenRe = mode.tokenRe; + this.nonTokenRe = mode.nonTokenRe; + + + if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); + this.$options.wrapMethod.set.call(this, this.$wrapMethod); + this.$setFolding(mode.foldingRules); + this.bgTokenizer.start(0); + this._emit("changeMode"); + } + }; + + this.$stopWorker = function() { + if (this.$worker) { + this.$worker.terminate(); + this.$worker = null; + } + }; + + this.$startWorker = function() { + try { + this.$worker = this.$mode.createWorker(this); + } catch (e) { + config.warn("Could not load worker", e); + this.$worker = null; + } + }; + this.getMode = function() { + return this.$mode; + }; + + this.$scrollTop = 0; + this.setScrollTop = function(scrollTop) { + if (this.$scrollTop === scrollTop || isNaN(scrollTop)) + return; + + this.$scrollTop = scrollTop; + this._signal("changeScrollTop", scrollTop); + }; + this.getScrollTop = function() { + return this.$scrollTop; + }; + + this.$scrollLeft = 0; + this.setScrollLeft = function(scrollLeft) { + if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) + return; + + this.$scrollLeft = scrollLeft; + this._signal("changeScrollLeft", scrollLeft); + }; + this.getScrollLeft = function() { + return this.$scrollLeft; + }; + this.getScreenWidth = function() { + this.$computeWidth(); + if (this.lineWidgets) + return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth); + return this.screenWidth; + }; + + this.getLineWidgetMaxWidth = function() { + if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth; + var width = 0; + this.lineWidgets.forEach(function(w) { + if (w && w.screenWidth > width) + width = w.screenWidth; + }); + return this.lineWidgetWidth = width; + }; + + this.$computeWidth = function(force) { + if (this.$modified || force) { + this.$modified = false; + + if (this.$useWrapMode) + return this.screenWidth = this.$wrapLimit; + + var lines = this.doc.getAllLines(); + var cache = this.$rowLengthCache; + var longestScreenLine = 0; + var foldIndex = 0; + var foldLine = this.$foldData[foldIndex]; + var foldStart = foldLine ? foldLine.start.row : Infinity; + var len = lines.length; + + for (var i = 0; i < len; i++) { + if (i > foldStart) { + i = foldLine.end.row + 1; + if (i >= len) + break; + foldLine = this.$foldData[foldIndex++]; + foldStart = foldLine ? foldLine.start.row : Infinity; + } + + if (cache[i] == null) + cache[i] = this.$getStringScreenWidth(lines[i])[0]; + + if (cache[i] > longestScreenLine) + longestScreenLine = cache[i]; + } + this.screenWidth = longestScreenLine; + } + }; + this.getLine = function(row) { + return this.doc.getLine(row); + }; + this.getLines = function(firstRow, lastRow) { + return this.doc.getLines(firstRow, lastRow); + }; + this.getLength = function() { + return this.doc.getLength(); + }; + this.getTextRange = function(range) { + return this.doc.getTextRange(range || this.selection.getRange()); + }; + this.insert = function(position, text) { + return this.doc.insert(position, text); + }; + this.remove = function(range) { + return this.doc.remove(range); + }; + this.removeFullLines = function(firstRow, lastRow){ + return this.doc.removeFullLines(firstRow, lastRow); + }; + this.undoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = deltas.length - 1; i != -1; i--) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.revertDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, true, lastUndoRange); + } else { + delta.deltas.forEach(function(foldDelta) { + this.addFolds(foldDelta.folds); + }, this); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.redoChanges = function(deltas, dontSelect) { + if (!deltas.length) + return; + + this.$fromUndo = true; + var lastUndoRange = null; + for (var i = 0; i < deltas.length; i++) { + var delta = deltas[i]; + if (delta.group == "doc") { + this.doc.applyDeltas(delta.deltas); + lastUndoRange = + this.$getUndoSelection(delta.deltas, false, lastUndoRange); + } + } + this.$fromUndo = false; + lastUndoRange && + this.$undoSelect && + !dontSelect && + this.selection.setSelectionRange(lastUndoRange); + return lastUndoRange; + }; + this.setUndoSelect = function(enable) { + this.$undoSelect = enable; + }; + + this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { + function isInsert(delta) { + return isUndo ? delta.action !== "insert" : delta.action === "insert"; + } + + var delta = deltas[0]; + var range, point; + var lastDeltaIsInsert = false; + if (isInsert(delta)) { + range = Range.fromPoints(delta.start, delta.end); + lastDeltaIsInsert = true; + } else { + range = Range.fromPoints(delta.start, delta.start); + lastDeltaIsInsert = false; + } + + for (var i = 1; i < deltas.length; i++) { + delta = deltas[i]; + if (isInsert(delta)) { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range.setStart(point); + } + point = delta.end; + if (range.compare(point.row, point.column) == 1) { + range.setEnd(point); + } + lastDeltaIsInsert = true; + } else { + point = delta.start; + if (range.compare(point.row, point.column) == -1) { + range = Range.fromPoints(delta.start, delta.start); + } + lastDeltaIsInsert = false; + } + } + if (lastUndoRange != null) { + if (Range.comparePoints(lastUndoRange.start, range.start) === 0) { + lastUndoRange.start.column += range.end.column - range.start.column; + lastUndoRange.end.column += range.end.column - range.start.column; + } + + var cmp = lastUndoRange.compareRange(range); + if (cmp == 1) { + range.setStart(lastUndoRange.start); + } else if (cmp == -1) { + range.setEnd(lastUndoRange.end); + } + } + + return range; + }; + this.replace = function(range, text) { + return this.doc.replace(range, text); + }; + this.moveText = function(fromRange, toPosition, copy) { + var text = this.getTextRange(fromRange); + var folds = this.getFoldsInRange(fromRange); + + var toRange = Range.fromPoints(toPosition, toPosition); + if (!copy) { + this.remove(fromRange); + var rowDiff = fromRange.start.row - fromRange.end.row; + var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column; + if (collDiff) { + if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column) + toRange.start.column += collDiff; + if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column) + toRange.end.column += collDiff; + } + if (rowDiff && toRange.start.row >= fromRange.end.row) { + toRange.start.row += rowDiff; + toRange.end.row += rowDiff; + } + } + + toRange.end = this.insert(toRange.start, text); + if (folds.length) { + var oldStart = fromRange.start; + var newStart = toRange.start; + var rowDiff = newStart.row - oldStart.row; + var collDiff = newStart.column - oldStart.column; + this.addFolds(folds.map(function(x) { + x = x.clone(); + if (x.start.row == oldStart.row) + x.start.column += collDiff; + if (x.end.row == oldStart.row) + x.end.column += collDiff; + x.start.row += rowDiff; + x.end.row += rowDiff; + return x; + })); + } + + return toRange; + }; + this.indentRows = function(startRow, endRow, indentString) { + indentString = indentString.replace(/\t/g, this.getTabString()); + for (var row=startRow; row<=endRow; row++) + this.doc.insertInLine({row: row, column: 0}, indentString); + }; + this.outdentRows = function (range) { + var rowRange = range.collapseRows(); + var deleteRange = new Range(0, 0, 0, 0); + var size = this.getTabSize(); + + for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) { + var line = this.getLine(i); + + deleteRange.start.row = i; + deleteRange.end.row = i; + for (var j = 0; j < size; ++j) + if (line.charAt(j) != ' ') + break; + if (j < size && line.charAt(j) == '\t') { + deleteRange.start.column = j; + deleteRange.end.column = j + 1; + } else { + deleteRange.start.column = 0; + deleteRange.end.column = j; + } + this.remove(deleteRange); + } + }; + + this.$moveLines = function(firstRow, lastRow, dir) { + firstRow = this.getRowFoldStart(firstRow); + lastRow = this.getRowFoldEnd(lastRow); + if (dir < 0) { + var row = this.getRowFoldStart(firstRow + dir); + if (row < 0) return 0; + var diff = row-firstRow; + } else if (dir > 0) { + var row = this.getRowFoldEnd(lastRow + dir); + if (row > this.doc.getLength()-1) return 0; + var diff = row-lastRow; + } else { + firstRow = this.$clipRowToDocument(firstRow); + lastRow = this.$clipRowToDocument(lastRow); + var diff = lastRow - firstRow + 1; + } + + var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE); + var folds = this.getFoldsInRange(range).map(function(x){ + x = x.clone(); + x.start.row += diff; + x.end.row += diff; + return x; + }); + + var lines = dir == 0 + ? this.doc.getLines(firstRow, lastRow) + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow+diff, lines); + folds.length && this.addFolds(folds); + return diff; + }; + this.moveLinesUp = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, -1); + }; + this.moveLinesDown = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 1); + }; + this.duplicateLines = function(firstRow, lastRow) { + return this.$moveLines(firstRow, lastRow, 0); + }; + + + this.$clipRowToDocument = function(row) { + return Math.max(0, Math.min(row, this.doc.getLength()-1)); + }; + + this.$clipColumnToRow = function(row, column) { + if (column < 0) + return 0; + return Math.min(this.doc.getLine(row).length, column); + }; + + + this.$clipPositionToDocument = function(row, column) { + column = Math.max(0, column); + + if (row < 0) { + row = 0; + column = 0; + } else { + var len = this.doc.getLength(); + if (row >= len) { + row = len - 1; + column = this.doc.getLine(len-1).length; + } else { + column = Math.min(this.doc.getLine(row).length, column); + } + } + + return { + row: row, + column: column + }; + }; + + this.$clipRangeToDocument = function(range) { + if (range.start.row < 0) { + range.start.row = 0; + range.start.column = 0; + } else { + range.start.column = this.$clipColumnToRow( + range.start.row, + range.start.column + ); + } + + var len = this.doc.getLength() - 1; + if (range.end.row > len) { + range.end.row = len; + range.end.column = this.doc.getLine(len).length; + } else { + range.end.column = this.$clipColumnToRow( + range.end.row, + range.end.column + ); + } + return range; + }; + this.$wrapLimit = 80; + this.$useWrapMode = false; + this.$wrapLimitRange = { + min : null, + max : null + }; + this.setUseWrapMode = function(useWrapMode) { + if (useWrapMode != this.$useWrapMode) { + this.$useWrapMode = useWrapMode; + this.$modified = true; + this.$resetRowCache(0); + if (useWrapMode) { + var len = this.getLength(); + this.$wrapData = Array(len); + this.$updateWrapData(0, len - 1); + } + + this._signal("changeWrapMode"); + } + }; + this.getUseWrapMode = function() { + return this.$useWrapMode; + }; + this.setWrapLimitRange = function(min, max) { + if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { + this.$wrapLimitRange = { min: min, max: max }; + this.$modified = true; + if (this.$useWrapMode) + this._signal("changeWrapMode"); + } + }; + this.adjustWrapLimit = function(desiredLimit, $printMargin) { + var limits = this.$wrapLimitRange; + if (limits.max < 0) + limits = {min: $printMargin, max: $printMargin}; + var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); + if (wrapLimit != this.$wrapLimit && wrapLimit > 1) { + this.$wrapLimit = wrapLimit; + this.$modified = true; + if (this.$useWrapMode) { + this.$updateWrapData(0, this.getLength() - 1); + this.$resetRowCache(0); + this._signal("changeWrapLimit"); + } + return true; + } + return false; + }; + + this.$constrainWrapLimit = function(wrapLimit, min, max) { + if (min) + wrapLimit = Math.max(min, wrapLimit); + + if (max) + wrapLimit = Math.min(max, wrapLimit); + + return wrapLimit; + }; + this.getWrapLimit = function() { + return this.$wrapLimit; + }; + this.setWrapLimit = function (limit) { + this.setWrapLimitRange(limit, limit); + }; + this.getWrapLimitRange = function() { + return { + min : this.$wrapLimitRange.min, + max : this.$wrapLimitRange.max + }; + }; + + this.$updateInternalDataOnChange = function(delta) { + var useWrapMode = this.$useWrapMode; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; + var removedFolds = null; + + this.$updating = true; + if (len != 0) { + if (action === "remove") { + this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); + + var foldLines = this.$foldData; + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + var foldLine = this.getFoldLine(end.row); + var idx = 0; + if (foldLine) { + foldLine.addRemoveChars(end.row, end.column, start.column - end.column); + foldLine.shiftRow(-len); + + var foldLineBefore = this.getFoldLine(firstRow); + if (foldLineBefore && foldLineBefore !== foldLine) { + foldLineBefore.merge(foldLine); + foldLine = foldLineBefore; + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= end.row) { + foldLine.shiftRow(-len); + } + } + + lastRow = firstRow; + } else { + var args = Array(len); + args.unshift(firstRow, 0); + var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache + arr.splice.apply(arr, args); + var foldLines = this.$foldData; + var foldLine = this.getFoldLine(firstRow); + var idx = 0; + if (foldLine) { + var cmp = foldLine.range.compareInside(start.row, start.column); + if (cmp == 0) { + foldLine = foldLine.split(start.row, start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } + } else + if (cmp == -1) { + foldLine.addRemoveChars(firstRow, 0, end.column - start.column); + foldLine.shiftRow(len); + } + idx = foldLines.indexOf(foldLine) + 1; + } + + for (idx; idx < foldLines.length; idx++) { + var foldLine = foldLines[idx]; + if (foldLine.start.row >= firstRow) { + foldLine.shiftRow(len); + } + } + } + } else { + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); + this.removeFolds(removedFolds); + + len = -len; + } + var foldLine = this.getFoldLine(firstRow); + if (foldLine) { + foldLine.addRemoveChars(firstRow, start.column, len); + } + } + + if (useWrapMode && this.$wrapData.length != this.doc.getLength()) { + console.error("doc.getLength() and $wrapData.length have to be the same!"); + } + this.$updating = false; + + if (useWrapMode) + this.$updateWrapData(firstRow, lastRow); + else + this.$updateRowLengthCache(firstRow, lastRow); + + return removedFolds; + }; + + this.$updateRowLengthCache = function(firstRow, lastRow, b) { + this.$rowLengthCache[firstRow] = null; + this.$rowLengthCache[lastRow] = null; + }; + + this.$updateWrapData = function(firstRow, lastRow) { + var lines = this.doc.getAllLines(); + var tabSize = this.getTabSize(); + var wrapData = this.$wrapData; + var wrapLimit = this.$wrapLimit; + var tokens; + var foldLine; + + var row = firstRow; + lastRow = Math.min(lastRow, lines.length - 1); + while (row <= lastRow) { + foldLine = this.getFoldLine(row, foldLine); + if (!foldLine) { + tokens = this.$getDisplayTokens(lines[row]); + wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row ++; + } else { + tokens = []; + foldLine.walk(function(placeholder, row, column, lastColumn) { + var walkTokens; + if (placeholder != null) { + walkTokens = this.$getDisplayTokens( + placeholder, tokens.length); + walkTokens[0] = PLACEHOLDER_START; + for (var i = 1; i < walkTokens.length; i++) { + walkTokens[i] = PLACEHOLDER_BODY; + } + } else { + walkTokens = this.$getDisplayTokens( + lines[row].substring(lastColumn, column), + tokens.length); + } + tokens = tokens.concat(walkTokens); + }.bind(this), + foldLine.end.row, + lines[foldLine.end.row].length + 1 + ); + + wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize); + row = foldLine.end.row + 1; + } + } + }; + var CHAR = 1, + CHAR_EXT = 2, + PLACEHOLDER_START = 3, + PLACEHOLDER_BODY = 4, + PUNCTUATION = 9, + SPACE = 10, + TAB = 11, + TAB_SPACE = 12; + + + this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { + if (tokens.length == 0) { + return []; + } + + var splits = []; + var displayLength = tokens.length; + var lastSplit = 0, lastDocSplit = 0; + + var isCode = this.$wrapAsCode; + + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } + function addSplit(screenPos) { + var displayed = tokens.slice(lastSplit, screenPos); + var len = displayed.length; + displayed.join("") + .replace(/12/g, function() { + len -= 1; + }) + .replace(/2/g, function() { + len -= 1; + }); + + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } + lastDocSplit += len; + splits.push(lastDocSplit); + lastSplit = screenPos; + } + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; + if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { + addSplit(split); + continue; + } + if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) { + for (split; split != lastSplit - 1; split--) { + if (tokens[split] == PLACEHOLDER_START) { + break; + } + } + if (split > lastSplit) { + addSplit(split); + continue; + } + split = lastSplit + wrapLimit; + for (split; split < tokens.length; split++) { + if (tokens[split] != PLACEHOLDER_BODY) { + break; + } + } + if (split == tokens.length) { + break; // Breaks the while-loop. + } + addSplit(split); + continue; + } + var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + if (isCode) { + while (split > minSplit && tokens[split] < PLACEHOLDER_START) { + split --; + } + while (split > minSplit && tokens[split] == PUNCTUATION) { + split --; + } + } else { + while (split > minSplit && tokens[split] < SPACE) { + split --; + } + } + if (split > minSplit) { + addSplit(++split); + continue; + } + split = lastSplit + wrapLimit; + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); + } + return splits; + }; + this.$getDisplayTokens = function(str, offset) { + var arr = []; + var tabSize; + offset = offset || 0; + + for (var i = 0; i < str.length; i++) { + var c = str.charCodeAt(i); + if (c == 9) { + tabSize = this.getScreenTabSize(arr.length + offset); + arr.push(TAB); + for (var n = 1; n < tabSize; n++) { + arr.push(TAB_SPACE); + } + } + else if (c == 32) { + arr.push(SPACE); + } else if((c > 39 && c < 48) || (c > 57 && c < 64)) { + arr.push(PUNCTUATION); + } + else if (c >= 0x1100 && isFullWidth(c)) { + arr.push(CHAR, CHAR_EXT); + } else { + arr.push(CHAR); + } + } + return arr; + }; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn == 0) + return [0, 0]; + if (maxScreenColumn == null) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charCodeAt(column); + if (c == 9) { + screenColumn += this.getScreenTabSize(screenColumn); + } + else if (c >= 0x1100 && isFullWidth(c)) { + screenColumn += 2; + } else { + screenColumn += 1; + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + + this.lineWidgets = null; + this.getRowLength = function(row) { + if (this.lineWidgets) + var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0 + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + this.getRowLineCount = function(row) { + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1; + } else { + return this.$wrapData[row].length + 1; + } + }; + + this.getRowWrapIndent = function(screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; + } else { + return 0; + } + } + this.getScreenLastRowColumn = function(screenRow) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + return this.documentToScreenColumn(pos.row, pos.column); + }; + this.getDocumentLastRowColumn = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.getScreenLastRowColumn(screenRow); + }; + this.getDocumentLastRowColumnPosition = function(docRow, docColumn) { + var screenRow = this.documentToScreenRow(docRow, docColumn); + return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10); + }; + this.getRowSplitData = function(row) { + if (!this.$useWrapMode) { + return undefined; + } else { + return this.$wrapData[row]; + } + }; + this.getScreenTabSize = function(screenColumn) { + return this.$tabSize - screenColumn % this.$tabSize; + }; + + + this.screenToDocumentRow = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).row; + }; + + + this.screenToDocumentColumn = function(screenRow, screenColumn) { + return this.screenToDocumentPosition(screenRow, screenColumn).column; + }; + this.screenToDocumentPosition = function(screenRow, screenColumn) { + if (screenRow < 0) + return {row: 0, column: 0}; + + var line; + var docRow = 0; + var docColumn = 0; + var column; + var row = 0; + var rowLength = 0; + + var rowCache = this.$screenRowCache; + var i = this.$getRowCacheIndex(rowCache, screenRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var docRow = this.$docRowCache[i]; + var doCache = screenRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var maxRow = this.getLength() - 1; + var foldLine = this.getNextFoldLine(docRow); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (row <= screenRow) { + rowLength = this.getRowLength(docRow); + if (row + rowLength > screenRow || docRow >= maxRow) { + break; + } else { + row += rowLength; + docRow++; + if (docRow > foldStart) { + docRow = foldLine.end.row+1; + foldLine = this.getNextFoldLine(docRow, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + } + + if (doCache) { + this.$docRowCache.push(docRow); + this.$screenRowCache.push(row); + } + } + + if (foldLine && foldLine.start.row <= docRow) { + line = this.getFoldDisplayLine(foldLine); + docRow = foldLine.start.row; + } else if (row + rowLength <= screenRow || docRow > maxRow) { + return { + row: maxRow, + column: this.getLine(maxRow).length + }; + } else { + line = this.getLine(docRow); + foldLine = null; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var splits = this.$wrapData[docRow]; + if (splits) { + var splitIndex = Math.floor(screenRow - row); + column = splits[splitIndex]; + if(splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; + docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; + line = line.substring(docColumn); + } + } + } + + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; + if (this.$useWrapMode && docColumn >= column) + docColumn = column - 1; + + if (foldLine) + return foldLine.idxToPosition(docColumn); + + return {row: docRow, column: docColumn}; + }; + this.documentToScreenPosition = function(docRow, docColumn) { + if (typeof docColumn === "undefined") + var pos = this.$clipPositionToDocument(docRow.row, docRow.column); + else + pos = this.$clipPositionToDocument(docRow, docColumn); + + docRow = pos.row; + docColumn = pos.column; + + var screenRow = 0; + var foldStartRow = null; + var fold = null; + fold = this.getFoldAt(docRow, docColumn, 1); + if (fold) { + docRow = fold.start.row; + docColumn = fold.start.column; + } + + var rowEnd, row = 0; + + + var rowCache = this.$docRowCache; + var i = this.$getRowCacheIndex(rowCache, docRow); + var l = rowCache.length; + if (l && i >= 0) { + var row = rowCache[i]; + var screenRow = this.$screenRowCache[i]; + var doCache = docRow > rowCache[l - 1]; + } else { + var doCache = !l; + } + + var foldLine = this.getNextFoldLine(row); + var foldStart = foldLine ?foldLine.start.row :Infinity; + + while (row < docRow) { + if (row >= foldStart) { + rowEnd = foldLine.end.row + 1; + if (rowEnd > docRow) + break; + foldLine = this.getNextFoldLine(rowEnd, foldLine); + foldStart = foldLine ?foldLine.start.row :Infinity; + } + else { + rowEnd = row + 1; + } + + screenRow += this.getRowLength(row); + row = rowEnd; + + if (doCache) { + this.$docRowCache.push(row); + this.$screenRowCache.push(screenRow); + } + } + var textLine = ""; + if (foldLine && row >= foldStart) { + textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn); + foldStartRow = foldLine.start.row; + } else { + textLine = this.getLine(docRow).substring(0, docColumn); + foldStartRow = docRow; + } + var wrapIndent = 0; + if (this.$useWrapMode) { + var wrapRow = this.$wrapData[foldStartRow]; + if (wrapRow) { + var screenRowOffset = 0; + while (textLine.length >= wrapRow[screenRowOffset]) { + screenRow ++; + screenRowOffset++; + } + textLine = textLine.substring( + wrapRow[screenRowOffset - 1] || 0, textLine.length + ); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; + } + } + + return { + row: screenRow, + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] + }; + }; + this.documentToScreenColumn = function(row, docColumn) { + return this.documentToScreenPosition(row, docColumn).column; + }; + this.documentToScreenRow = function(docRow, docColumn) { + return this.documentToScreenPosition(docRow, docColumn).row; + }; + this.getScreenLength = function() { + var screenRows = 0; + var fold = null; + if (!this.$useWrapMode) { + screenRows = this.getLength(); + var foldData = this.$foldData; + for (var i = 0; i < foldData.length; i++) { + fold = foldData[i]; + screenRows -= fold.end.row - fold.start.row; + } + } else { + var lastRow = this.$wrapData.length; + var row = 0, i = 0; + var fold = this.$foldData[i++]; + var foldStart = fold ? fold.start.row :Infinity; + + while (row < lastRow) { + var splits = this.$wrapData[row]; + screenRows += splits ? splits.length + 1 : 1; + row ++; + if (row > foldStart) { + row = fold.end.row+1; + fold = this.$foldData[i++]; + foldStart = fold ?fold.start.row :Infinity; + } + } + } + if (this.lineWidgets) + screenRows += this.$getWidgetScreenLength(); + + return screenRows; + }; + this.$setFontMetrics = function(fm) { + if (!this.$enableVarChar) return; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + }; + + this.destroy = function() { + if (this.bgTokenizer) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer = null; + } + this.$stopWorker(); + }; + function isFullWidth(c) { + if (c < 0x1100) + return false; + return c >= 0x1100 && c <= 0x115F || + c >= 0x11A3 && c <= 0x11A7 || + c >= 0x11FA && c <= 0x11FF || + c >= 0x2329 && c <= 0x232A || + c >= 0x2E80 && c <= 0x2E99 || + c >= 0x2E9B && c <= 0x2EF3 || + c >= 0x2F00 && c <= 0x2FD5 || + c >= 0x2FF0 && c <= 0x2FFB || + c >= 0x3000 && c <= 0x303E || + c >= 0x3041 && c <= 0x3096 || + c >= 0x3099 && c <= 0x30FF || + c >= 0x3105 && c <= 0x312D || + c >= 0x3131 && c <= 0x318E || + c >= 0x3190 && c <= 0x31BA || + c >= 0x31C0 && c <= 0x31E3 || + c >= 0x31F0 && c <= 0x321E || + c >= 0x3220 && c <= 0x3247 || + c >= 0x3250 && c <= 0x32FE || + c >= 0x3300 && c <= 0x4DBF || + c >= 0x4E00 && c <= 0xA48C || + c >= 0xA490 && c <= 0xA4C6 || + c >= 0xA960 && c <= 0xA97C || + c >= 0xAC00 && c <= 0xD7A3 || + c >= 0xD7B0 && c <= 0xD7C6 || + c >= 0xD7CB && c <= 0xD7FB || + c >= 0xF900 && c <= 0xFAFF || + c >= 0xFE10 && c <= 0xFE19 || + c >= 0xFE30 && c <= 0xFE52 || + c >= 0xFE54 && c <= 0xFE66 || + c >= 0xFE68 && c <= 0xFE6B || + c >= 0xFF01 && c <= 0xFF60 || + c >= 0xFFE0 && c <= 0xFFE6; + } + +}).call(EditSession.prototype); + +require("./edit_session/folding").Folding.call(EditSession.prototype); +require("./edit_session/bracket_match").BracketMatch.call(EditSession.prototype); + + +config.defineOptions(EditSession.prototype, "session", { + wrap: { + set: function(value) { + if (!value || value == "off") + value = false; + else if (value == "free") + value = true; + else if (value == "printMargin") + value = -1; + else if (typeof value == "string") + value = parseInt(value, 10) || false; + + if (this.$wrap == value) + return; + this.$wrap = value; + if (!value) { + this.setUseWrapMode(false); + } else { + var col = typeof value == "number" ? value : null; + this.setWrapLimitRange(col, col); + this.setUseWrapMode(true); + } + }, + get: function() { + if (this.getUseWrapMode()) { + if (this.$wrap == -1) + return "printMargin"; + if (!this.getWrapLimitRange().min) + return "free"; + return this.$wrap; + } + return "off"; + }, + handlesSet: true + }, + wrapMethod: { + set: function(val) { + val = val == "auto" + ? this.$mode.type != "text" + : val != "text"; + if (val != this.$wrapAsCode) { + this.$wrapAsCode = val; + if (this.$useWrapMode) { + this.$modified = true; + this.$resetRowCache(0); + this.$updateWrapData(0, this.getLength() - 1); + } + } + }, + initialValue: "auto" + }, + indentedSoftWrap: { initialValue: true }, + firstLineNumber: { + set: function() {this._signal("changeBreakpoint");}, + initialValue: 1 + }, + useWorker: { + set: function(useWorker) { + this.$useWorker = useWorker; + + this.$stopWorker(); + if (useWorker) + this.$startWorker(); + }, + initialValue: true + }, + useSoftTabs: {initialValue: true}, + tabSize: { + set: function(tabSize) { + if (isNaN(tabSize) || this.$tabSize === tabSize) return; + + this.$modified = true; + this.$rowLengthCache = []; + this.$tabSize = tabSize; + this._signal("changeTabSize"); + }, + initialValue: 4, + handlesSet: true + }, + overwrite: { + set: function(val) {this._signal("changeOverwrite");}, + initialValue: false + }, + newLineMode: { + set: function(val) {this.doc.setNewLineMode(val)}, + get: function() {return this.doc.getNewLineMode()}, + handlesSet: true + }, + mode: { + set: function(val) { this.setMode(val) }, + get: function() { return this.$modeId } + } +}); + +exports.EditSession = EditSession; +}); + +ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var Search = function() { + this.$options = {}; +}; + +(function() { + this.set = function(options) { + oop.mixin(this.$options, options); + return this; + }; + this.getOptions = function() { + return lang.copyObject(this.$options); + }; + this.setOptions = function(options) { + this.$options = options; + }; + this.find = function(session) { + var options = this.$options; + var iterator = this.$matchIterator(session, options); + if (!iterator) + return false; + + var firstRange = null; + iterator.forEach(function(range, row, offset) { + if (!range.start) { + var column = range.offset + (offset || 0); + firstRange = new Range(row, column, row, column + range.length); + if (!range.length && options.start && options.start.start + && options.skipCurrent != false && firstRange.isEqual(options.start) + ) { + firstRange = null; + return false; + } + } else + firstRange = range; + return true; + }); + + return firstRange; + }; + this.findAll = function(session) { + var options = this.$options; + if (!options.needle) + return []; + this.$assembleRegExp(options); + + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); + + var ranges = []; + var re = options.re; + if (options.$isMultiLine) { + var len = re.length; + var maxRow = lines.length - len; + var prevRange; + outer: for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) + if (lines[row + j].search(re[j]) == -1) + continue outer; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.length - startLine.match(re[0])[0].length; + var endIndex = line.match(re[len - 1])[0].length; + + if (prevRange && prevRange.end.row === row && + prevRange.end.column > startIndex + ) { + continue; + } + ranges.push(prevRange = new Range( + row, startIndex, row + len - 1, endIndex + )); + if (len > 2) + row = row + len - 2; + } + } else { + for (var i = 0; i < lines.length; i++) { + var matches = lang.getMatchOffsets(lines[i], re); + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + ranges.push(new Range(i, match.offset, i, match.offset + match.length)); + } + } + } + + if (range) { + var startColumn = range.start.column; + var endColumn = range.start.column; + var i = 0, j = ranges.length - 1; + while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row) + i++; + + while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row) + j--; + + ranges = ranges.slice(i, j + 1); + for (i = 0, j = ranges.length; i < j; i++) { + ranges[i].start.row += range.start.row; + ranges[i].end.row += range.start.row; + } + } + + return ranges; + }; + this.replace = function(input, replacement) { + var options = this.$options; + + var re = this.$assembleRegExp(options); + if (options.$isMultiLine) + return replacement; + + if (!re) + return; + + var match = re.exec(input); + if (!match || match[0].length != input.length) + return null; + + replacement = input.replace(re, replacement); + if (options.preserveCase) { + replacement = replacement.split(""); + for (var i = Math.min(input.length, input.length); i--; ) { + var ch = input[i]; + if (ch && ch.toLowerCase() != ch) + replacement[i] = replacement[i].toUpperCase(); + else + replacement[i] = replacement[i].toLowerCase(); + } + replacement = replacement.join(""); + } + + return replacement; + }; + + this.$matchIterator = function(session, options) { + var re = this.$assembleRegExp(options); + if (!re) + return false; + + var callback; + if (options.$isMultiLine) { + var len = re.length; + var matchIterator = function(line, row, offset) { + var startIndex = line.search(re[0]); + if (startIndex == -1) + return; + for (var i = 1; i < len; i++) { + line = session.getLine(row + i); + if (line.search(re[i]) == -1) + return; + } + + var endIndex = line.match(re[len - 1])[0].length; + + var range = new Range(row, startIndex, row + len - 1, endIndex); + if (re.offset == 1) { + range.start.row--; + range.start.column = Number.MAX_VALUE; + } else if (offset) + range.start.column += offset; + + if (callback(range)) + return true; + }; + } else if (options.backwards) { + var matchIterator = function(line, row, startIndex) { + var matches = lang.getMatchOffsets(line, re); + for (var i = matches.length-1; i >= 0; i--) + if (callback(matches[i], row, startIndex)) + return true; + }; + } else { + var matchIterator = function(line, row, startIndex) { + var matches = lang.getMatchOffsets(line, re); + for (var i = 0; i < matches.length; i++) + if (callback(matches[i], row, startIndex)) + return true; + }; + } + + var lineIterator = this.$lineIterator(session, options); + + return { + forEach: function(_callback) { + callback = _callback; + lineIterator.forEach(matchIterator); + } + }; + }; + + this.$assembleRegExp = function(options, $disableFakeMultiline) { + if (options.needle instanceof RegExp) + return options.re = options.needle; + + var needle = options.needle; + + if (!options.needle) + return options.re = false; + + if (!options.regExp) + needle = lang.escapeRegExp(needle); + + if (options.wholeWord) + needle = "\\b" + needle + "\\b"; + + var modifier = options.caseSensitive ? "gm" : "gmi"; + + options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); + if (options.$isMultiLine) + return options.re = this.$assembleMultilineRegExp(needle, modifier); + + try { + var re = new RegExp(needle, modifier); + } catch(e) { + re = false; + } + return options.re = re; + }; + + this.$assembleMultilineRegExp = function(needle, modifier) { + var parts = needle.replace(/\r\n|\r|\n/g, "$\n^").split("\n"); + var re = []; + for (var i = 0; i < parts.length; i++) try { + re.push(new RegExp(parts[i], modifier)); + } catch(e) { + return false; + } + if (parts[0] == "") { + re.shift(); + re.offset = 1; + } else { + re.offset = 0; + } + return re; + }; + + this.$lineIterator = function(session, options) { + var backwards = options.backwards == true; + var skipCurrent = options.skipCurrent != false; + + var range = options.range; + var start = options.start; + if (!start) + start = range ? range[backwards ? "end" : "start"] : session.selection.getRange(); + + if (start.start) + start = start[skipCurrent != backwards ? "end" : "start"]; + + var firstRow = range ? range.start.row : 0; + var lastRow = range ? range.end.row : session.getLength() - 1; + + var forEach = backwards ? function(callback) { + var row = start.row; + + var line = session.getLine(row).substring(0, start.column); + if (callback(line, row)) + return; + + for (row--; row >= firstRow; row--) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = lastRow, firstRow = start.row; row >= firstRow; row--) + if (callback(session.getLine(row), row)) + return; + } : function(callback) { + var row = start.row; + + var line = session.getLine(row).substr(start.column); + if (callback(line, row, start.column)) + return; + + for (row = row+1; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + }; + + return {forEach: forEach}; + }; + +}).call(Search.prototype); + +exports.Search = Search; +}); + +ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; + +function HashHandler(config, platform) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = true; +} + +function MultiHashHandler(config, platform) { + HashHandler.call(this, config, platform); + this.$singleCommand = false; +} + +MultiHashHandler.prototype = HashHandler.prototype; + +(function() { + + + this.addCommand = function(command) { + if (this.commands[command.name]) + this.removeCommand(command); + + this.commands[command.name] = command; + + if (command.bindKey) + this._buildKeyHash(command); + }; + + this.removeCommand = function(command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } + } + } + }; + + this.bindKey = function(key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({exec: command, bindKey: key, name: command.name || key}); + + key.split("|").forEach(function(keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function(keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + + function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position || 0; + } + this._addCommandToBinding = function(keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; + } else { + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + + if (typeof position != "number") { + if (position || command.isDefault) + position = -100; + else + position = getPosition(command); + } + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; + } + commands.splice(i, 0, command); + } + }; + + this.addCommands = function(commands) { + commands && Object.keys(commands).forEach(function(name) { + var command = commands[name]; + if (!command) + return; + + if (typeof command === "string") + return this.bindKey(command, name); + + if (typeof command === "function") + command = { exec: command }; + + if (typeof command !== "object") + return; + + if (!command.name) + command.name = name; + + this.addCommand(command); + }, this); + }; + + this.removeCommands = function(commands) { + Object.keys(commands).forEach(function(name) { + this.removeCommand(commands[name]); + }, this); + }; + + this.bindKeys = function(keyList) { + Object.keys(keyList).forEach(function(key) { + this.bindKey(key, keyList[key]); + }, this); + }; + + this._buildKeyHash = function(command) { + this.bindKey(command.bindKey, command); + }; + this.parseKeys = function(keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); + var key = parts.pop(); + + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return {key: key, hashId: -1}; + else if (parts.length == 1 && parts[0] == "shift") + return {key: key.toUpperCase(), hashId: -1}; + + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return {key: key, hashId: hashId}; + }; + + this.findKeyCommand = function findKeyCommand(hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + + this.handleKeyboard = function(data, hashId, keyString, keyCode) { + if (keyCode < 0) return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; + } + + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return {command: "null"}; + } + } + + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain + } + return {command: command}; + }; + + this.getStatusText = function(editor, data) { + return data.$keyChain || ""; + }; + +}).call(HashHandler.prototype); + +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; +}); + +ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CommandManager = function(platform, commands) { + MultiHashHandler.call(this, commands, platform); + this.byName = this.commands; + this.setDefaultHandler("exec", function(e) { + return e.command.exec(e.editor, e.args || {}); + }); +}; + +oop.inherits(CommandManager, MultiHashHandler); + +(function() { + + oop.implement(this, EventEmitter); + + this.exec = function(command, editor, args) { + if (Array.isArray(command)) { + for (var i = command.length; i--; ) { + if (this.exec(command[i], editor, args)) return true; + } + return false; + } + + if (typeof command === "string") + command = this.commands[command]; + + if (!command) + return false; + + if (editor && editor.$readOnly && !command.readOnly) + return false; + + var e = {editor: editor, command: command, args: args}; + e.returnValue = this._emit("exec", e); + this._signal("afterExec", e); + + return e.returnValue === false ? false : true; + }; + + this.toggleRecording = function(editor) { + if (this.$inReplay) + return; + + editor && editor._emit("changeStatus"); + if (this.recording) { + this.macro.pop(); + this.removeEventListener("exec", this.$addCommandToMacro); + + if (!this.macro.length) + this.macro = this.oldMacro; + + return this.recording = false; + } + if (!this.$addCommandToMacro) { + this.$addCommandToMacro = function(e) { + this.macro.push([e.command, e.args]); + }.bind(this); + } + + this.oldMacro = this.macro; + this.macro = []; + this.on("exec", this.$addCommandToMacro); + return this.recording = true; + }; + + this.replay = function(editor) { + if (this.$inReplay || !this.macro) + return; + + if (this.recording) + return this.toggleRecording(editor); + + try { + this.$inReplay = true; + this.macro.forEach(function(x) { + if (typeof x == "string") + this.exec(x, editor); + else + this.exec(x[0], editor, x[1]); + }, this); + } finally { + this.$inReplay = false; + } + }; + + this.trimMacro = function(m) { + return m.map(function(x){ + if (typeof x[0] != "string") + x[0] = x[0].name; + if (!x[1]) + x = x[0]; + return x; + }); + }; + +}).call(CommandManager.prototype); + +exports.CommandManager = CommandManager; + +}); + +ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); +var config = require("../config"); +var Range = require("../range").Range; + +function bindKey(win, mac) { + return {win: win, mac: mac}; +} +exports.commands = [{ + name: "showSettingsMenu", + bindKey: bindKey("Ctrl-,", "Command-,"), + exec: function(editor) { + config.loadModule("ace/ext/settings_menu", function(module) { + module.init(editor); + editor.showSettingsMenu(); + }); + }, + readOnly: true +}, { + name: "goToNextError", + bindKey: bindKey("Alt-E", "Ctrl-E"), + exec: function(editor) { + config.loadModule("ace/ext/error_marker", function(module) { + module.showErrorMarker(editor, 1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "goToPreviousError", + bindKey: bindKey("Alt-Shift-E", "Ctrl-Shift-E"), + exec: function(editor) { + config.loadModule("ace/ext/error_marker", function(module) { + module.showErrorMarker(editor, -1); + }); + }, + scrollIntoView: "animate", + readOnly: true +}, { + name: "selectall", + bindKey: bindKey("Ctrl-A", "Command-A"), + exec: function(editor) { editor.selectAll(); }, + readOnly: true +}, { + name: "centerselection", + bindKey: bindKey(null, "Ctrl-L"), + exec: function(editor) { editor.centerSelection(); }, + readOnly: true +}, { + name: "gotoline", + bindKey: bindKey("Ctrl-L", "Command-L"), + exec: function(editor) { + var line = parseInt(prompt("Enter line number:"), 10); + if (!isNaN(line)) { + editor.gotoLine(line); + } + }, + readOnly: true +}, { + name: "fold", + bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), + exec: function(editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "unfold", + bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), + exec: function(editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleFoldWidget", + bindKey: bindKey("F2", "F2"), + exec: function(editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "toggleParentFoldWidget", + bindKey: bindKey("Alt-F2", "Alt-F2"), + exec: function(editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "foldall", + bindKey: bindKey(null, "Ctrl-Command-Option-0"), + exec: function(editor) { editor.session.foldAll(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "foldOther", + bindKey: bindKey("Alt-0", "Command-Option-0"), + exec: function(editor) { + editor.session.foldAll(); + editor.session.unfold(editor.selection.getAllRanges()); + }, + scrollIntoView: "center", + readOnly: true +}, { + name: "unfoldall", + bindKey: bindKey("Alt-Shift-0", "Command-Option-Shift-0"), + exec: function(editor) { editor.session.unfold(); }, + scrollIntoView: "center", + readOnly: true +}, { + name: "findnext", + bindKey: bindKey("Ctrl-K", "Command-G"), + exec: function(editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "findprevious", + bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), + exec: function(editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", + readOnly: true +}, { + name: "selectOrFindNext", + bindKey: bindKey("Alt-K", "Ctrl-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findNext(); + }, + readOnly: true +}, { + name: "selectOrFindPrevious", + bindKey: bindKey("Alt-Shift-K", "Ctrl-Shift-G"), + exec: function(editor) { + if (editor.selection.isEmpty()) + editor.selection.selectWord(); + else + editor.findPrevious(); + }, + readOnly: true +}, { + name: "find", + bindKey: bindKey("Ctrl-F", "Command-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor)}); + }, + readOnly: true +}, { + name: "overwrite", + bindKey: "Insert", + exec: function(editor) { editor.toggleOverwrite(); }, + readOnly: true +}, { + name: "selecttostart", + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"), + exec: function(editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotostart", + bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), + exec: function(editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectup", + bindKey: bindKey("Shift-Up", "Shift-Up"), + exec: function(editor) { editor.getSelection().selectUp(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golineup", + bindKey: bindKey("Up", "Up|Ctrl-P"), + exec: function(editor, args) { editor.navigateUp(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttoend", + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"), + exec: function(editor) { editor.getSelection().selectFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "gotoend", + bindKey: bindKey("Ctrl-End", "Command-End|Command-Down"), + exec: function(editor) { editor.navigateFileEnd(); }, + multiSelectAction: "forEach", + readOnly: true, + scrollIntoView: "animate", + aceCommandGroup: "fileJump" +}, { + name: "selectdown", + bindKey: bindKey("Shift-Down", "Shift-Down"), + exec: function(editor) { editor.getSelection().selectDown(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "golinedown", + bindKey: bindKey("Down", "Down|Ctrl-N"), + exec: function(editor, args) { editor.navigateDown(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordleft", + bindKey: bindKey("Ctrl-Shift-Left", "Option-Shift-Left"), + exec: function(editor) { editor.getSelection().selectWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordleft", + bindKey: bindKey("Ctrl-Left", "Option-Left"), + exec: function(editor) { editor.navigateWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolinestart", + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"), + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolinestart", + bindKey: bindKey("Alt-Left|Home", "Command-Left|Home|Ctrl-A"), + exec: function(editor) { editor.navigateLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectleft", + bindKey: bindKey("Shift-Left", "Shift-Left"), + exec: function(editor) { editor.getSelection().selectLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoleft", + bindKey: bindKey("Left", "Left|Ctrl-B"), + exec: function(editor, args) { editor.navigateLeft(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectwordright", + bindKey: bindKey("Ctrl-Shift-Right", "Option-Shift-Right"), + exec: function(editor) { editor.getSelection().selectWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotowordright", + bindKey: bindKey("Ctrl-Right", "Option-Right"), + exec: function(editor) { editor.navigateWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selecttolineend", + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"), + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotolineend", + bindKey: bindKey("Alt-Right|End", "Command-Right|End|Ctrl-E"), + exec: function(editor) { editor.navigateLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectright", + bindKey: bindKey("Shift-Right", "Shift-Right"), + exec: function(editor) { editor.getSelection().selectRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "gotoright", + bindKey: bindKey("Right", "Right|Ctrl-F"), + exec: function(editor, args) { editor.navigateRight(args.times); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectpagedown", + bindKey: "Shift-PageDown", + exec: function(editor) { editor.selectPageDown(); }, + readOnly: true +}, { + name: "pagedown", + bindKey: bindKey(null, "Option-PageDown"), + exec: function(editor) { editor.scrollPageDown(); }, + readOnly: true +}, { + name: "gotopagedown", + bindKey: bindKey("PageDown", "PageDown|Ctrl-V"), + exec: function(editor) { editor.gotoPageDown(); }, + readOnly: true +}, { + name: "selectpageup", + bindKey: "Shift-PageUp", + exec: function(editor) { editor.selectPageUp(); }, + readOnly: true +}, { + name: "pageup", + bindKey: bindKey(null, "Option-PageUp"), + exec: function(editor) { editor.scrollPageUp(); }, + readOnly: true +}, { + name: "gotopageup", + bindKey: "PageUp", + exec: function(editor) { editor.gotoPageUp(); }, + readOnly: true +}, { + name: "scrollup", + bindKey: bindKey("Ctrl-Up", null), + exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "scrolldown", + bindKey: bindKey("Ctrl-Down", null), + exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); }, + readOnly: true +}, { + name: "selectlinestart", + bindKey: "Shift-Home", + exec: function(editor) { editor.getSelection().selectLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectlineend", + bindKey: "Shift-End", + exec: function(editor) { editor.getSelection().selectLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "togglerecording", + bindKey: bindKey("Ctrl-Alt-E", "Command-Option-E"), + exec: function(editor) { editor.commands.toggleRecording(editor); }, + readOnly: true +}, { + name: "replaymacro", + bindKey: bindKey("Ctrl-Shift-E", "Command-Shift-E"), + exec: function(editor) { editor.commands.replay(editor); }, + readOnly: true +}, { + name: "jumptomatching", + bindKey: bindKey("Ctrl-P", "Ctrl-P"), + exec: function(editor) { editor.jumpToMatching(); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "selecttomatching", + bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"), + exec: function(editor) { editor.jumpToMatching(true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "expandToMatching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function(editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "passKeysToBrowser", + bindKey: bindKey(null, null), + exec: function() {}, + passEvent: true, + readOnly: true +}, { + name: "copy", + exec: function(editor) { + }, + readOnly: true +}, +{ + name: "cut", + exec: function(editor) { + var range = editor.getSelectionRange(); + editor._emit("cut", range); + + if (!editor.selection.isEmpty()) { + editor.session.remove(range); + editor.clearSelection(); + } + }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "paste", + exec: function(editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" +}, { + name: "removeline", + bindKey: bindKey("Ctrl-D", "Command-D"), + exec: function(editor) { editor.removeLines(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEachLine" +}, { + name: "duplicateSelection", + bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"), + exec: function(editor) { editor.duplicateSelection(); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "sortlines", + bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"), + exec: function(editor) { editor.sortLines(); }, + scrollIntoView: "selection", + multiSelectAction: "forEachLine" +}, { + name: "togglecomment", + bindKey: bindKey("Ctrl-/", "Command-/"), + exec: function(editor) { editor.toggleCommentLines(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "toggleBlockComment", + bindKey: bindKey("Ctrl-Shift-/", "Command-Shift-/"), + exec: function(editor) { editor.toggleBlockComment(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "modifyNumberUp", + bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), + exec: function(editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "modifyNumberDown", + bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), + exec: function(editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", + multiSelectAction: "forEach" +}, { + name: "replace", + bindKey: bindKey("Ctrl-H", "Command-Option-F"), + exec: function(editor) { + config.loadModule("ace/ext/searchbox", function(e) {e.Search(editor, true)}); + } +}, { + name: "undo", + bindKey: bindKey("Ctrl-Z", "Command-Z"), + exec: function(editor) { editor.undo(); } +}, { + name: "redo", + bindKey: bindKey("Ctrl-Shift-Z|Ctrl-Y", "Command-Shift-Z|Command-Y"), + exec: function(editor) { editor.redo(); } +}, { + name: "copylinesup", + bindKey: bindKey("Alt-Shift-Up", "Command-Option-Up"), + exec: function(editor) { editor.copyLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesup", + bindKey: bindKey("Alt-Up", "Option-Up"), + exec: function(editor) { editor.moveLinesUp(); }, + scrollIntoView: "cursor" +}, { + name: "copylinesdown", + bindKey: bindKey("Alt-Shift-Down", "Command-Option-Down"), + exec: function(editor) { editor.copyLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "movelinesdown", + bindKey: bindKey("Alt-Down", "Option-Down"), + exec: function(editor) { editor.moveLinesDown(); }, + scrollIntoView: "cursor" +}, { + name: "del", + bindKey: bindKey("Delete", "Delete|Ctrl-D|Shift-Delete"), + exec: function(editor) { editor.remove("right"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "backspace", + bindKey: bindKey( + "Shift-Backspace|Backspace", + "Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H" + ), + exec: function(editor) { editor.remove("left"); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "cut_or_delete", + bindKey: bindKey("Shift-Delete", null), + exec: function(editor) { + if (editor.selection.isEmpty()) { + editor.remove("left"); + } else { + return false; + } + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolinestart", + bindKey: bindKey("Alt-Backspace", "Command-Backspace"), + exec: function(editor) { editor.removeToLineStart(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removetolineend", + bindKey: bindKey("Alt-Delete", "Ctrl-K"), + exec: function(editor) { editor.removeToLineEnd(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordleft", + bindKey: bindKey("Ctrl-Backspace", "Alt-Backspace|Ctrl-Alt-Backspace"), + exec: function(editor) { editor.removeWordLeft(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "removewordright", + bindKey: bindKey("Ctrl-Delete", "Alt-Delete"), + exec: function(editor) { editor.removeWordRight(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "outdent", + bindKey: bindKey("Shift-Tab", "Shift-Tab"), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "indent", + bindKey: bindKey("Tab", "Tab"), + exec: function(editor) { editor.indent(); }, + multiSelectAction: "forEach", + scrollIntoView: "selectionPart" +}, { + name: "blockoutdent", + bindKey: bindKey("Ctrl-[", "Ctrl-["), + exec: function(editor) { editor.blockOutdent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "blockindent", + bindKey: bindKey("Ctrl-]", "Ctrl-]"), + exec: function(editor) { editor.blockIndent(); }, + multiSelectAction: "forEachLine", + scrollIntoView: "selectionPart" +}, { + name: "insertstring", + exec: function(editor, str) { editor.insert(str); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "inserttext", + exec: function(editor, args) { + editor.insert(lang.stringRepeat(args.text || "", args.times || 1)); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "splitline", + bindKey: bindKey(null, "Ctrl-O"), + exec: function(editor) { editor.splitLine(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "transposeletters", + bindKey: bindKey("Ctrl-T", "Ctrl-T"), + exec: function(editor) { editor.transposeLetters(); }, + multiSelectAction: function(editor) {editor.transposeSelections(1); }, + scrollIntoView: "cursor" +}, { + name: "touppercase", + bindKey: bindKey("Ctrl-U", "Ctrl-U"), + exec: function(editor) { editor.toUpperCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "tolowercase", + bindKey: bindKey("Ctrl-Shift-U", "Ctrl-Shift-U"), + exec: function(editor) { editor.toLowerCase(); }, + multiSelectAction: "forEach", + scrollIntoView: "cursor" +}, { + name: "expandtoline", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function(editor) { + var range = editor.selection.getRange(); + + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "joinlines", + bindKey: bindKey(null, null), + exec: function(editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "invertSelection", + bindKey: bindKey(null, null), + exec: function(editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } else { + newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + + editor.exitMultiSelectMode(); + editor.clearSelection(); + + for(var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" +}]; + +}); + +ace.define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var Editor = function(renderer, session) { + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.keyBinding = new KeyBinding(this); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + + this.$blockScrolling = 0; + this.$search = new Search().set({ + wrap: true + }); + + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + + this.$initOperationListeners(); + + this._$emitInputEvent = lang.delayedCall(function() { + this._signal("input", {}); + if (this.session && this.session.bgTokenizer) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + + this.on("change", function(_, _self) { + _self._$emitInputEvent.schedule(31); + }); + + this.setSession(session || new EditSession("")); + config.resetOptions(this); + config._signal("editor", this); +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$initOperationListeners = function() { + function last(a) {return a[a.length - 1]} + + this.selections = []; + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + + this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this)); + + this.on("change", function() { + this.curOp || this.startOperation(); + this.curOp.docChanged = true; + }.bind(this), true); + + this.on("changeSelection", function() { + this.curOp || this.startOperation(); + this.curOp.selectionChanged = true; + }.bind(this), true); + }; + + this.curOp = null; + this.prevOp = {}; + this.startOperation = function(commadEvent) { + if (this.curOp) { + if (!commadEvent || this.curOp.command) + return; + this.prevOp = this.curOp; + } + if (!commadEvent) { + this.previousCommand = null; + commadEvent = {}; + } + + this.$opResetTimer.schedule(); + this.curOp = { + command: commadEvent.command || {}, + args: commadEvent.args, + scrollTop: this.renderer.scrollTop + }; + if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined) + this.$blockScrolling++; + }; + + this.endOperation = function(e) { + if (this.curOp) { + if (e && e.returnValue === false) + return this.curOp = null; + this._signal("beforeEndOperation"); + var command = this.curOp.command; + if (command.name && this.$blockScrolling > 0) + this.$blockScrolling--; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + + this.prevOp = this.curOp; + this.curOp = null; + } + }; + this.$mergeableCommands = ["backspace", "del", "insertstring"]; + this.$historyTracker = function(e) { + if (!this.$mergeUndoDeltas) + return; + + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + + this.mergeNextCommand = true; + } else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + + if ( + this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000 + ) { + shouldMerge = false; // the sequence is too long + } + + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + this.setKeyboardHandler = function(keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function(module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + this.getKeyboardHandler = function() { + return this.keyBinding.getKeyboardHandler(); + }; + this.setSession = function(session) { + if (this.session == session) + return; + if (this.curOp) this.endOperation(); + this.curOp = {}; + + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + + this.onChangeMode(); + + this.$blockScrolling += 1; + this.onCursorChange(); + this.$blockScrolling -= 1; + + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } else { + this.selection = null; + this.renderer.setSession(session); + } + + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + + this.curOp = null; + + oldSession && oldSession._signal("changeEditor", {oldEditor: this}); + session && session._signal("changeEditor", {editor: this}); + }; + this.getSession = function() { + return this.session; + }; + this.setValue = function(val, cursorPos) { + this.session.doc.setValue(val); + + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + + return val; + }; + this.getValue = function() { + return this.session.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.resize = function(force) { + this.renderer.onResize(force); + }; + this.setTheme = function(theme, cb) { + this.renderer.setTheme(theme, cb); + }; + this.getTheme = function() { + return this.renderer.getTheme(); + }; + this.setStyle = function(style) { + this.renderer.setStyle(style); + }; + this.unsetStyle = function(style) { + this.renderer.unsetStyle(style); + }; + this.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container, "fontSize"); + }; + this.setFontSize = function(size) { + this.setOption("fontSize", size); + }; + + this.$highlightBrackets = function() { + if (this.session.$bracketHighlight) { + this.session.removeMarker(this.session.$bracketHighlight); + this.session.$bracketHighlight = null; + } + + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function() { + self.$highlightPending = false; + var session = self.session; + if (!session || !session.bgTokenizer) return; + var pos = session.findMatchingBracket(self.getCursorPosition()); + if (pos) { + var range = new Range(pos.row, pos.column, pos.row, pos.column + 1); + } else if (session.$mode.getMatching) { + var range = session.$mode.getMatching(self.session); + } + if (range) + session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text"); + }, 50); + }; + this.$highlightTags = function() { + if (this.$highlightTagPending) + return; + var self = this; + this.$highlightTagPending = true; + setTimeout(function() { + self.$highlightTagPending = false; + + var session = self.session; + if (!session || !session.bgTokenizer) return; + + var pos = self.getCursorPosition(); + var iterator = new TokenIterator(self.session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + + if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + return; + } + + if (token.type.indexOf("tag-open") != -1) { + token = iterator.stepForward(); + if (!token) + return; + } + + var tag = token.value; + var depth = 0; + var prevToken = iterator.stepBackward(); + + if (prevToken.value == '<'){ + do { + prevToken = token; + token = iterator.stepForward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<'){ + depth++; + } else if (prevToken.value === '= 0); + } else { + do { + token = prevToken; + prevToken = iterator.stepBackward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<') { + depth++; + } else if (prevToken.value === ' 1)) + highlight = false; + } + + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + + this.onSelectionChange = function(e) { + var session = this.session; + + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } else { + this.$updateHighlightActiveLine(); + } + + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + + this._signal("changeSelection"); + }; + + this.$getSelectionHighLightRegexp = function() { + var session = this.session; + + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + + var startOuter = selection.start.column - 1; + var endOuter = selection.end.column + 1; + var line = session.getLine(selection.start.row); + var lineCols = line.length; + var needle = line.substring(Math.max(startOuter, 0), + Math.min(endOuter, lineCols)); + if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || + (endOuter <= lineCols && /[\w\d]$/.test(needle))) + return; + + needle = line.substring(selection.start.column, selection.end.column); + if (!/^[\w\d]+$/.test(needle)) + return; + + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + + return re; + }; + + + this.onChangeFrontMarker = function() { + this.renderer.updateFrontMarkers(); + }; + + this.onChangeBackMarker = function() { + this.renderer.updateBackMarkers(); + }; + + + this.onChangeBreakpoint = function() { + this.renderer.updateBreakpoints(); + }; + + this.onChangeAnnotation = function() { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + + + this.onChangeMode = function(e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + + + this.onChangeWrapLimit = function() { + this.renderer.updateFull(); + }; + + this.onChangeWrapMode = function() { + this.renderer.onResize(true); + }; + + + this.onChangeFold = function() { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + this.getSelectedText = function() { + return this.session.getTextRange(this.getSelectionRange()); + }; + this.getCopyText = function() { + var text = this.getSelectedText(); + this._signal("copy", text); + return text; + }; + this.onCopy = function() { + this.commands.exec("copy", this); + }; + this.onCut = function() { + this.commands.exec("cut", this); + }; + this.onPaste = function(text, event) { + var e = {text: text, event: event}; + this.commands.exec("paste", this, e); + }; + + this.$handlePaste = function(e) { + if (typeof e == "string") + e = {text: e}; + this._signal("paste", e); + var text = e.text; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + this.insert(text); + } else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + if (lines.length > ranges.length || lines.length < 2 || !lines[1]) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + this.session.remove(range); + + this.session.insert(range.start, lines[i]); + } + } + }; + + this.execCommand = function(command, args) { + return this.commands.exec(command, this, args); + }; + this.insert = function(text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + this.session.mergeUndoDeltas = false; + this.$mergeNextCommand = false; + } + text = transform.text; + + } + } + + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite()) { + var range = new Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + var end = session.insert(cursor, text); + + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange( + new Range(cursor.row, start + transform.selection[0], + cursor.row, start + transform.selection[1])); + } else { // Transform relative to the current row. + this.selection.setSelectionRange( + new Range(cursor.row + transform.selection[0], + transform.selection[1], + cursor.row + transform.selection[2], + transform.selection[3])); + } + } + + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + + session.insert({row: cursor.row+1, column: 0}, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + }; + + this.onTextInput = function(text) { + this.keyBinding.onTextInput(text); + }; + + this.onCommandKey = function(e, hashId, keyCode) { + this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + this.setOverwrite = function(overwrite) { + this.session.setOverwrite(overwrite); + }; + this.getOverwrite = function() { + return this.session.getOverwrite(); + }; + this.toggleOverwrite = function() { + this.session.toggleOverwrite(); + }; + this.setScrollSpeed = function(speed) { + this.setOption("scrollSpeed", speed); + }; + this.getScrollSpeed = function() { + return this.getOption("scrollSpeed"); + }; + this.setDragDelay = function(dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + this.getDragDelay = function() { + return this.getOption("dragDelay"); + }; + this.setSelectionStyle = function(val) { + this.setOption("selectionStyle", val); + }; + this.getSelectionStyle = function() { + return this.getOption("selectionStyle"); + }; + this.setHighlightActiveLine = function(shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + this.getHighlightActiveLine = function() { + return this.getOption("highlightActiveLine"); + }; + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + this.setHighlightSelectedWord = function(shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + this.getHighlightSelectedWord = function() { + return this.$highlightSelectedWord; + }; + + this.setAnimatedScroll = function(shouldAnimate){ + this.renderer.setAnimatedScroll(shouldAnimate); + }; + + this.getAnimatedScroll = function(){ + return this.renderer.getAnimatedScroll(); + }; + this.setShowInvisibles = function(showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.renderer.getShowInvisibles(); + }; + + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.renderer.getShowPrintMargin(); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.renderer.getPrintMarginColumn(); + }; + this.setReadOnly = function(readOnly) { + this.setOption("readOnly", readOnly); + }; + this.getReadOnly = function() { + return this.getOption("readOnly"); + }; + this.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + this.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + this.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + this.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + this.setShowFoldWidgets = function(show) { + this.setOption("showFoldWidgets", show); + + }; + this.getShowFoldWidgets = function() { + return this.getOption("showFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(fade) { + this.setOption("fadeFoldWidgets", fade); + }; + + this.getFadeFoldWidgets = function() { + return this.getOption("fadeFoldWidgets"); + }; + this.remove = function(dir) { + if (this.selection.isEmpty()){ + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.removeWordRight = function() { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeWordLeft = function() { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineStart = function() { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineEnd = function() { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.splitLine = function() { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + this.transposeLetters = function() { + if (!this.selection.isEmpty()) { + return; + } + + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column-1); + range = new Range(cursor.row, column-1, cursor.row, column+1); + } + else { + swap = line.charAt(column-1) + line.charAt(column-2); + range = new Range(cursor.row, column-2, cursor.row, column); + } + this.session.replace(range, swap); + }; + this.toLowerCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + this.toUpperCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + this.indent = function() { + var session = this.session; + var range = this.getSelectionRange(); + + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } else { + var count = column % size; + while (line[range.start.column] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + this.blockIndent = function() { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + this.blockOutdent = function() { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + this.sortLines = function() { + var rows = this.$getSelectedRows(); + var session = this.session; + + var lines = []; + for (i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + + lines.sort(function(a, b) { + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); + + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i-rows.first]); + } + }; + this.toggleCommentLines = function() { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + + this.toggleBlockComment = function() { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + this.getNumberAt = function(row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if(m.index <= column && m.index+m[0].length >= column){ + var number = { + value: m[0], + start: m.index, + end: m.index+m[0].length + }; + return number; + } + } + return null; + }; + this.modifyNumber = function(amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column-1, row, column); + + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + + + if(fp !== nr.end && column < fp){ + amount *= Math.pow(10, nr.end - column - 1); + } else { + amount *= Math.pow(10, nr.end - column); + } + + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); + + } + } + }; + this.removeLines = function() { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse); + } + }; + this.moveLinesDown = function() { + this.$moveLines(1, false); + }; + this.moveLinesUp = function() { + this.$moveLines(-1, false); + }; + this.moveText = function(range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + this.copyLinesUp = function() { + this.$moveLines(-1, true); + }; + this.copyLinesDown = function() { + this.$moveLines(1, true); + }; + this.$moveLines = function(dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) diff = 0; + totalDiff += diff; + } + + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + this.$getSelectedRows = function(range) { + range = (range || this.getSelectionRange()).collapseRows(); + + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + + this.onCompositionStart = function(text) { + this.renderer.showComposition(this.getCursorPosition()); + }; + + this.onCompositionUpdate = function(text) { + this.renderer.setCompositionText(text); + }; + + this.onCompositionEnd = function() { + this.renderer.hideComposition(); + }; + this.getFirstVisibleRow = function() { + return this.renderer.getFirstVisibleRow(); + }; + this.getLastVisibleRow = function() { + return this.renderer.getLastVisibleRow(); + }; + this.isRowVisible = function(row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + this.isRowFullyVisible = function(row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + this.$getVisibleRowCount = function() { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + + this.$moveByPage = function(dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + + this.$blockScrolling++; + if (select === true) { + this.selection.$moveSelection(function(){ + this.moveCursorBy(rows, 0); + }); + } else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + this.$blockScrolling--; + + var scrollTop = renderer.scrollTop; + + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + + renderer.animateScrolling(scrollTop); + }; + this.selectPageDown = function() { + this.$moveByPage(1, true); + }; + this.selectPageUp = function() { + this.$moveByPage(-1, true); + }; + this.gotoPageDown = function() { + this.$moveByPage(1, false); + }; + this.gotoPageUp = function() { + this.$moveByPage(-1, false); + }; + this.scrollPageDown = function() { + this.$moveByPage(1); + }; + this.scrollPageUp = function() { + this.$moveByPage(-1); + }; + this.scrollToRow = function(row) { + this.renderer.scrollToRow(row); + }; + this.scrollToLine = function(line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + this.centerSelection = function() { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + this.getCursorPosition = function() { + return this.selection.getCursor(); + }; + this.getCursorPositionScreen = function() { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + this.getSelectionRange = function() { + return this.selection.getRange(); + }; + this.selectAll = function() { + this.$blockScrolling += 1; + this.selection.selectAll(); + this.$blockScrolling -= 1; + }; + this.clearSelection = function() { + this.selection.clearSelection(); + }; + this.moveCursorTo = function(row, column) { + this.selection.moveCursorTo(row, column); + }; + this.moveCursorToPosition = function(pos) { + this.selection.moveCursorToPosition(pos); + }; + this.jumpToMatching = function(select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var token = prevToken || iterator.stepForward(); + + if (!token) return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token && token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + + if (prevToken.value === '<') { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if(this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + + this.selection.setSelectionRange(selection); + this.$blockScrolling -= 1; + + return replaced; + }; + + this.$tryReplace = function(range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } else { + return null; + } + }; + this.getLastSearchOptions = function() { + return this.$search.getOptions(); + }; + this.find = function(needle, options, animate) { + if (!options) + options = {}; + + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({needle: needle}); + } + + this.$search.set(options); + if (!options.start) + this.$search.set({start: range}); + + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + this.findNext = function(options, animate) { + this.find({skipCurrent: true, backwards: false}, options, animate); + }; + this.findPrevious = function(options, animate) { + this.find(options, {skipCurrent: true, backwards: true}, animate); + }; + + this.revealRange = function(range, animate) { + this.$blockScrolling += 1; + this.session.unfold(range); + this.selection.setSelectionRange(range); + this.$blockScrolling -= 1; + + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); + }; + this.undo = function() { + this.$blockScrolling++; + this.session.getUndoManager().undo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.redo = function() { + this.$blockScrolling++; + this.session.getUndoManager().redo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.destroy = function() { + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) { + this.session.destroy(); + } + }; + this.setAutoScrollEditorIntoView = function(enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function() { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function() { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function() { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused()) + ) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function(enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; + }; + + + this.$resetCursorStyle = function() { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + +}).call(Editor.prototype); + + + +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function(style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", {data: style}); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function() {this.$updateHighlightActiveLine();}, + initialValue: true + }, + highlightSelectedWord: { + set: function(shouldHighlight) {this.$onSelectionChange();}, + initialValue: true + }, + readOnly: { + set: function(readOnly) { + this.$resetCursorStyle(); + }, + initialValue: false + }, + cursorStyle: { + set: function(val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: {initialValue: true}, + wrapBehavioursEnabled: {initialValue: true}, + autoScrollEditorIntoView: { + set: function(val) {this.setAutoScrollEditorIntoView(val)} + }, + keyboardHandler: { + set: function(val) { this.setKeyboardHandler(val); }, + get: function() { return this.keybindingId; }, + handlesSet: true + }, + + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + showLineNumbers: "renderer", + showGutter: "renderer", + displayIndentGuides: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimout: "$mouseHandler", + tooltipFollowsMouse: "$mouseHandler", + + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); + +exports.Editor = Editor; +}); + +ace.define("ace/undomanager",["require","exports","module"], function(require, exports, module) { +"use strict"; +var UndoManager = function() { + this.reset(); +}; + +(function() { + this.execute = function(options) { + var deltaSets = options.args[0]; + this.$doc = options.args[1]; + if (options.merge && this.hasUndo()){ + this.dirtyCounter--; + deltaSets = this.$undoStack.pop().concat(deltaSets); + } + this.$undoStack.push(deltaSets); + this.$redoStack = []; + if (this.dirtyCounter < 0) { + this.dirtyCounter = NaN; + } + this.dirtyCounter++; + }; + this.undo = function(dontSelect) { + var deltaSets = this.$undoStack.pop(); + var undoSelectionRange = null; + if (deltaSets) { + undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect); + this.$redoStack.push(deltaSets); + this.dirtyCounter--; + } + + return undoSelectionRange; + }; + this.redo = function(dontSelect) { + var deltaSets = this.$redoStack.pop(); + var redoSelectionRange = null; + if (deltaSets) { + redoSelectionRange = + this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect); + this.$undoStack.push(deltaSets); + this.dirtyCounter++; + } + return redoSelectionRange; + }; + this.reset = function() { + this.$undoStack = []; + this.$redoStack = []; + this.dirtyCounter = 0; + }; + this.hasUndo = function() { + return this.$undoStack.length > 0; + }; + this.hasRedo = function() { + return this.$redoStack.length > 0; + }; + this.markClean = function() { + this.dirtyCounter = 0; + }; + this.isClean = function() { + return this.dirtyCounter === 0; + }; + this.$serializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $serializeDelta); + }; + this.$deserializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $deserializeDelta); + }; + + function $serializeDelta(delta){ + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines.length == 1 ? null : delta.lines, + text: delta.lines.length == 1 ? delta.lines[0] : null + }; + } + + function $deserializeDelta(delta) { + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines || [delta.text] + }; + } + + function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) { + var deltaSets_new = new Array(deltaSets_old.length); + for (var i = 0; i < deltaSets_old.length; i++) { + var deltaSet_old = deltaSets_old[i]; + var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)}; + + for (var j = 0; j < deltaSet_old.deltas.length; j++) { + var delta_old = deltaSet_old.deltas[j]; + deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old); + } + + deltaSets_new[i] = deltaSet_new; + } + return deltaSets_new; + } + +}).call(UndoManager.prototype); + +exports.UndoManager = UndoManager; +}); + +ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var oop = require("../lib/oop"); +var lang = require("../lib/lang"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Gutter = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_gutter-layer"; + parentEl.appendChild(this.element); + this.setShowFoldWidgets(this.$showFoldWidgets); + + this.gutterWidth = 0; + + this.$annotations = []; + this.$updateAnnotations = this.$updateAnnotations.bind(this); + + this.$cells = []; +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.setSession = function(session) { + if (this.session) + this.session.removeEventListener("change", this.$updateAnnotations); + this.session = session; + if (session) + session.on("change", this.$updateAnnotations); + }; + + this.addGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.addGutterDecoration"); + this.session.addGutterDecoration(row, className); + }; + + this.removeGutterDecoration = function(row, className){ + if (window.console) + console.warn && console.warn("deprecated use session.removeGutterDecoration"); + this.session.removeGutterDecoration(row, className); + }; + + this.setAnnotations = function(annotations) { + this.$annotations = []; + for (var i = 0; i < annotations.length; i++) { + var annotation = annotations[i]; + var row = annotation.row; + var rowInfo = this.$annotations[row]; + if (!rowInfo) + rowInfo = this.$annotations[row] = {text: []}; + + var annoText = annotation.text; + annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || ""; + + if (rowInfo.text.indexOf(annoText) === -1) + rowInfo.text.push(annoText); + + var type = annotation.type; + if (type == "error") + rowInfo.className = " ace_error"; + else if (type == "warning" && rowInfo.className != " ace_error") + rowInfo.className = " ace_warning"; + else if (type == "info" && (!rowInfo.className)) + rowInfo.className = " ace_info"; + } + }; + + this.$updateAnnotations = function (delta) { + if (!this.$annotations.length) + return; + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + if (len === 0) { + } else if (delta.action == 'remove') { + this.$annotations.splice(firstRow, len + 1, null); + } else { + var args = new Array(len + 1); + args.unshift(firstRow, 1); + this.$annotations.splice.apply(this.$annotations, args); + } + }; + + this.update = function(config) { + var session = this.session; + var firstRow = config.firstRow; + var lastRow = Math.min(config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar + session.getLength() - 1); + var fold = session.getNextFoldLine(firstRow); + var foldStart = fold ? fold.start.row : Infinity; + var foldWidgets = this.$showFoldWidgets && session.foldWidgets; + var breakpoints = session.$breakpoints; + var decorations = session.$decorations; + var firstLineNumber = session.$firstLineNumber; + var lastLineNumber = 0; + + var gutterRenderer = session.gutterRenderer || this.$renderer; + + var cell = null; + var index = -1; + var row = firstRow; + while (true) { + if (row > foldStart) { + row = fold.end.row + 1; + fold = session.getNextFoldLine(row, fold); + foldStart = fold ? fold.start.row : Infinity; + } + if (row > lastRow) { + while (this.$cells.length > index + 1) { + cell = this.$cells.pop(); + this.element.removeChild(cell.element); + } + break; + } + + cell = this.$cells[++index]; + if (!cell) { + cell = {element: null, textNode: null, foldWidget: null}; + cell.element = dom.createElement("div"); + cell.textNode = document.createTextNode(''); + cell.element.appendChild(cell.textNode); + this.element.appendChild(cell.element); + this.$cells[index] = cell; + } + + var className = "ace_gutter-cell "; + if (breakpoints[row]) + className += breakpoints[row]; + if (decorations[row]) + className += decorations[row]; + if (this.$annotations[row]) + className += this.$annotations[row].className; + if (cell.element.className != className) + cell.element.className = className; + + var height = session.getRowLength(row) * config.lineHeight + "px"; + if (height != cell.element.style.height) + cell.element.style.height = height; + + if (foldWidgets) { + var c = foldWidgets[row]; + if (c == null) + c = foldWidgets[row] = session.getFoldWidget(row); + } + + if (c) { + if (!cell.foldWidget) { + cell.foldWidget = dom.createElement("span"); + cell.element.appendChild(cell.foldWidget); + } + var className = "ace_fold-widget ace_" + c; + if (c == "start" && row == foldStart && row < fold.end.row) + className += " ace_closed"; + else + className += " ace_open"; + if (cell.foldWidget.className != className) + cell.foldWidget.className = className; + + var height = config.lineHeight + "px"; + if (cell.foldWidget.style.height != height) + cell.foldWidget.style.height = height; + } else { + if (cell.foldWidget) { + cell.element.removeChild(cell.foldWidget); + cell.foldWidget = null; + } + } + + var text = lastLineNumber = gutterRenderer + ? gutterRenderer.getText(session, row) + : row + firstLineNumber; + if (text != cell.textNode.data) + cell.textNode.data = text; + + row++; + } + + this.element.style.height = config.minHeight + "px"; + + if (this.$fixedWidth || session.$useWrapMode) + lastLineNumber = session.getLength() + firstLineNumber; + + var gutterWidth = gutterRenderer + ? gutterRenderer.getWidth(session, lastLineNumber, config) + : lastLineNumber.toString().length * config.characterWidth; + + var padding = this.$padding || this.$computePadding(); + gutterWidth += padding.left + padding.right; + if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) { + this.gutterWidth = gutterWidth; + this.element.style.width = Math.ceil(this.gutterWidth) + "px"; + this._emit("changeGutterWidth", gutterWidth); + } + }; + + this.$fixedWidth = false; + + this.$showLineNumbers = true; + this.$renderer = ""; + this.setShowLineNumbers = function(show) { + this.$renderer = !show && { + getWidth: function() {return ""}, + getText: function() {return ""} + }; + }; + + this.getShowLineNumbers = function() { + return this.$showLineNumbers; + }; + + this.$showFoldWidgets = true; + this.setShowFoldWidgets = function(show) { + if (show) + dom.addCssClass(this.element, "ace_folding-enabled"); + else + dom.removeCssClass(this.element, "ace_folding-enabled"); + + this.$showFoldWidgets = show; + this.$padding = null; + }; + + this.getShowFoldWidgets = function() { + return this.$showFoldWidgets; + }; + + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {}; + this.$padding.left = parseInt(style.paddingLeft) + 1 || 0; + this.$padding.right = parseInt(style.paddingRight) || 0; + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + +}).call(Gutter.prototype); + +exports.Gutter = Gutter; + +}); + +ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var dom = require("../lib/dom"); + +var Marker = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_marker-layer"; + parentEl.appendChild(this.element); +}; + +(function() { + + this.$padding = 0; + + this.setPadding = function(padding) { + this.$padding = padding; + }; + this.setSession = function(session) { + this.session = session; + }; + + this.setMarkers = function(markers) { + this.markers = markers; + }; + + this.update = function(config) { + var config = config || this.config; + if (!config) + return; + + this.config = config; + + + var html = []; + for (var key in this.markers) { + var marker = this.markers[key]; + + if (!marker.range) { + marker.update(html, this, this.session, config); + continue; + } + + var range = marker.range.clipRows(config.firstRow, config.lastRow); + if (range.isEmpty()) continue; + + range = range.toScreenRange(this.session); + if (marker.renderer) { + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + marker.renderer(html, range, left, top, config); + } else if (marker.type == "fullLine") { + this.drawFullLineMarker(html, range, marker.clazz, config); + } else if (marker.type == "screenLine") { + this.drawScreenLineMarker(html, range, marker.clazz, config); + } else if (range.isMultiLine()) { + if (marker.type == "text") + this.drawTextMarker(html, range, marker.clazz, config); + else + this.drawMultiLineMarker(html, range, marker.clazz, config); + } else { + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); + } + } + this.element.innerHTML = html.join(""); + }; + + this.$getTop = function(row, layerConfig) { + return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; + }; + + function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); + } + this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { + var session = this.session; + var start = range.start.row; + var end = range.end.row; + var row = start; + var prev = 0; + var curr = 0; + var next = session.getScreenLastRowColumn(row); + var lineRange = new Range(row, range.start.column, row, curr); + for (; row <= end; row++) { + lineRange.start.row = lineRange.end.row = row; + lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row); + lineRange.end.column = next; + prev = curr; + curr = next; + next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; + this.drawSingleLineMarker(stringBuilder, lineRange, + clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), + layerConfig, row == end ? 0 : 1, extraStyle); + } + }; + this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var padding = this.$padding; + var height = config.lineHeight; + var top = this.$getTop(range.start.row, config); + var left = padding + range.start.column * config.characterWidth; + extraStyle = extraStyle || ""; + + stringBuilder.push( + "
      " + ); + top = this.$getTop(range.end.row, config); + var width = range.end.column * config.characterWidth; + + stringBuilder.push( + "
      " + ); + height = (range.end.row - range.start.row - 1) * config.lineHeight; + if (height <= 0) + return; + top = this.$getTop(range.start.row + 1, config); + + var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); + + stringBuilder.push( + "
      " + ); + }; + this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) { + var height = config.lineHeight; + var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth; + + var top = this.$getTop(range.start.row, config); + var left = this.$padding + range.start.column * config.characterWidth; + + stringBuilder.push( + "
      " + ); + }; + + this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + if (range.start.row != range.end.row) + height += this.$getTop(range.end.row, config) - top; + + stringBuilder.push( + "
      " + ); + }; + + this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { + var top = this.$getTop(range.start.row, config); + var height = config.lineHeight; + + stringBuilder.push( + "
      " + ); + }; + +}).call(Marker.prototype); + +exports.Marker = Marker; + +}); + +ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var Text = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_text-layer"; + parentEl.appendChild(this.element); + this.$updateEolChar = this.$updateEolChar.bind(this); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.EOF_CHAR = "\xB6"; + this.EOL_CHAR_LF = "\xAC"; + this.EOL_CHAR_CRLF = "\xa4"; + this.EOL_CHAR = this.EOL_CHAR_LF; + this.TAB_CHAR = "\u2014"; //"\u21E5"; + this.SPACE_CHAR = "\xB7"; + this.$padding = 0; + + this.$updateEolChar = function() { + var EOL_CHAR = this.session.doc.getNewLineCharacter() == "\n" + ? this.EOL_CHAR_LF + : this.EOL_CHAR_CRLF; + if (this.EOL_CHAR != EOL_CHAR) { + this.EOL_CHAR = EOL_CHAR; + return true; + } + } + + this.setPadding = function(padding) { + this.$padding = padding; + this.element.style.padding = "0 " + padding + "px"; + }; + + this.getLineHeight = function() { + return this.$fontMetrics.$characterSize.height || 0; + }; + + this.getCharacterWidth = function() { + return this.$fontMetrics.$characterSize.width || 0; + }; + + this.$setFontMetrics = function(measure) { + this.$fontMetrics = measure; + this.$fontMetrics.on("changeCharacterSize", function(e) { + this._signal("changeCharacterSize", e); + }.bind(this)); + this.$pollSizeChanges(); + } + + this.checkForSizeChanges = function() { + this.$fontMetrics.checkForSizeChanges(); + }; + this.$pollSizeChanges = function() { + return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges(); + }; + this.setSession = function(session) { + this.session = session; + if (session) + this.$computeTabString(); + }; + + this.showInvisibles = false; + this.setShowInvisibles = function(showInvisibles) { + if (this.showInvisibles == showInvisibles) + return false; + + this.showInvisibles = showInvisibles; + this.$computeTabString(); + return true; + }; + + this.displayIndentGuides = true; + this.setDisplayIndentGuides = function(display) { + if (this.displayIndentGuides == display) + return false; + + this.displayIndentGuides = display; + this.$computeTabString(); + return true; + }; + + this.$tabStrings = []; + this.onChangeTabSize = + this.$computeTabString = function() { + var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; + var tabStr = this.$tabStrings = [0]; + for (var i = 1; i < tabSize + 1; i++) { + if (this.showInvisibles) { + tabStr.push("" + + lang.stringRepeat(this.TAB_CHAR, i) + + ""); + } else { + tabStr.push(lang.stringRepeat(" ", i)); + } + } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + var spaceClass = ""; + var tabClass = ""; + if (this.showInvisibles) { + className += " ace_invisible"; + spaceClass = " ace_invisible_space"; + tabClass = " ace_invisible_tab"; + var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); + var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize); + } else{ + var spaceContent = lang.stringRepeat(" ", this.tabSize); + var tabContent = spaceContent; + } + + this.$tabStrings[" "] = "" + spaceContent + ""; + this.$tabStrings["\t"] = "" + tabContent + ""; + } + }; + + this.updateLines = function(config, firstRow, lastRow) { + if (this.config.lastRow != config.lastRow || + this.config.firstRow != config.firstRow) { + this.scrollLines(config); + } + this.config = config; + + var first = Math.max(firstRow, config.firstRow); + var last = Math.min(lastRow, config.lastRow); + + var lineElements = this.element.childNodes; + var lineElementsIdx = 0; + + for (var row = config.firstRow; row < first; row++) { + var foldLine = this.session.getFoldLine(row); + if (foldLine) { + if (foldLine.containsRow(first)) { + first = foldLine.start.row; + break; + } else { + row = foldLine.end.row; + } + } + lineElementsIdx ++; + } + + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > last) + break; + + var lineElement = lineElements[lineElementsIdx++]; + if (lineElement) { + var html = []; + this.$renderLine( + html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false + ); + lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + "px"; + lineElement.innerHTML = html.join(""); + } + row++; + } + }; + + this.scrollLines = function(config) { + var oldConfig = this.config; + this.config = config; + + if (!oldConfig || oldConfig.lastRow < config.firstRow) + return this.update(config); + + if (config.lastRow < oldConfig.firstRow) + return this.update(config); + + var el = this.element; + if (oldConfig.firstRow < config.firstRow) + for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--) + el.removeChild(el.firstChild); + + if (oldConfig.lastRow > config.lastRow) + for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--) + el.removeChild(el.lastChild); + + if (config.firstRow < oldConfig.firstRow) { + var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1); + if (el.firstChild) + el.insertBefore(fragment, el.firstChild); + else + el.appendChild(fragment); + } + + if (config.lastRow > oldConfig.lastRow) { + var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow); + el.appendChild(fragment); + } + }; + + this.$renderLinesFragment = function(config, firstRow, lastRow) { + var fragment = this.element.ownerDocument.createDocumentFragment(); + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row : Infinity; + } + if (row > lastRow) + break; + + var container = dom.createElement("div"); + + var html = []; + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + container.innerHTML = html.join(""); + if (this.$useLineGroups()) { + container.className = 'ace_line_group'; + fragment.appendChild(container); + container.style.height = config.lineHeight * this.session.getRowLength(row) + "px"; + + } else { + while(container.firstChild) + fragment.appendChild(container.firstChild); + } + + row++; + } + return fragment; + }; + + this.update = function(config) { + this.config = config; + + var html = []; + var firstRow = config.firstRow, lastRow = config.lastRow; + + var row = firstRow; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > lastRow) + break; + + if (this.$useLineGroups()) + html.push("
      ") + + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); + + if (this.$useLineGroups()) + html.push("
      "); // end the line group + + row++; + } + this.element.innerHTML = html.join(""); + }; + + this.$textToken = { + "text": true, + "rparen": true, + "lparen": true + }; + + this.$renderToken = function(stringBuilder, screenColumn, token, value) { + var self = this; + var replaceReg = /\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; + var replaceFunc = function(c, a, b, tabIdx, idx4) { + if (a) { + return self.showInvisibles + ? "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" + : c; + } else if (c == "&") { + return "&"; + } else if (c == "<") { + return "<"; + } else if (c == ">") { + return ">"; + } else if (c == "\t") { + var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx); + screenColumn += tabSize - 1; + return self.$tabStrings[tabSize]; + } else if (c == "\u3000") { + var classToUse = self.showInvisibles ? "ace_cjk ace_invisible ace_invisible_space" : "ace_cjk"; + var space = self.showInvisibles ? self.SPACE_CHAR : ""; + screenColumn += 1; + return "" + space + ""; + } else if (b) { + return "" + self.SPACE_CHAR + ""; + } else { + screenColumn += 1; + return "" + c + ""; + } + }; + + var output = value.replace(replaceReg, replaceFunc); + + if (!this.$textToken[token.type]) { + var classes = "ace_" + token.type.replace(/\./g, " ace_"); + var style = ""; + if (token.type == "fold") + style = " style='width:" + (token.value.length * this.config.characterWidth) + "px;' "; + stringBuilder.push("", output, ""); + } + else { + stringBuilder.push(output); + } + return screenColumn + value.length; + }; + + this.renderIndentGuide = function(stringBuilder, value, max) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0 || cols >= max) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize)); + return value.substr(cols); + } else if (value[0] == "\t") { + stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols)); + return value.substr(cols); + } + return value; + }; + + this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) { + var chars = 0; + var split = 0; + var splitChars = splits[0]; + var screenColumn = 0; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + var value = token.value; + if (i == 0 && this.displayIndentGuides) { + chars = value.length; + value = this.renderIndentGuide(stringBuilder, value, splitChars); + if (!value) + continue; + chars -= value.length; + } + + if (chars + value.length < splitChars) { + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + chars += value.length; + } else { + while (chars + value.length >= splitChars) { + screenColumn = this.$renderToken( + stringBuilder, screenColumn, + token, value.substring(0, splitChars - chars) + ); + value = value.substring(splitChars - chars); + chars = splitChars; + + if (!onlyContents) { + stringBuilder.push("", + "
      " + ); + } + + stringBuilder.push(lang.stringRepeat("\xa0", splits.indent)); + + split ++; + screenColumn = 0; + splitChars = splits[split] || Number.MAX_VALUE; + } + if (value.length != 0) { + chars += value.length; + screenColumn = this.$renderToken( + stringBuilder, screenColumn, token, value + ); + } + } + } + }; + + this.$renderSimpleLine = function(stringBuilder, tokens) { + var screenColumn = 0; + var token = tokens[0]; + var value = token.value; + if (this.displayIndentGuides) + value = this.renderIndentGuide(stringBuilder, value); + if (value) + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + for (var i = 1; i < tokens.length; i++) { + token = tokens[i]; + value = token.value; + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + } + }; + this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + + + if (!onlyContents) { + stringBuilder.push( + "
      " + ); + } + + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) + this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents); + else + this.$renderSimpleLine(stringBuilder, tokens); + } + + if (this.showInvisibles) { + if (foldLine) + row = foldLine.end.row + + stringBuilder.push( + "", + row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, + "" + ); + } + if (!onlyContents) + stringBuilder.push("
      "); + }; + + this.$getFoldLineTokens = function(row, foldLine) { + var session = this.session; + var renderTokens = []; + + function addTokens(tokens, from, to) { + var idx = 0, col = 0; + while ((col + tokens[idx].value.length) < from) { + col += tokens[idx].value.length; + idx++; + + if (idx == tokens.length) + return; + } + if (col != from) { + var value = tokens[idx].value.substring(from - col); + if (value.length > (to - from)) + value = value.substring(0, to - from); + + renderTokens.push({ + type: tokens[idx].type, + value: value + }); + + col = from + value.length; + idx += 1; + } + + while (col < to && idx < tokens.length) { + var value = tokens[idx].value; + if (value.length + col > to) { + renderTokens.push({ + type: tokens[idx].type, + value: value.substring(0, to - col) + }); + } else + renderTokens.push(tokens[idx]); + col += value.length; + idx += 1; + } + } + + var tokens = session.getTokens(row); + foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { + if (placeholder != null) { + renderTokens.push({ + type: "fold", + value: placeholder + }); + } else { + if (isNewRow) + tokens = session.getTokens(row); + + if (tokens.length) + addTokens(tokens, lastColumn, column); + } + }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); + + return renderTokens; + }; + + this.$useLineGroups = function() { + return this.session.getUseWrapMode(); + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.$measureNode) + this.$measureNode.parentNode.removeChild(this.$measureNode); + delete this.$measureNode; + }; + +}).call(Text.prototype); + +exports.Text = Text; + +}); + +ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +var dom = require("../lib/dom"); +var isIE8; + +var Cursor = function(parentEl) { + this.element = dom.createElement("div"); + this.element.className = "ace_layer ace_cursor-layer"; + parentEl.appendChild(this.element); + + if (isIE8 === undefined) + isIE8 = !("opacity" in this.element.style); + + this.isVisible = false; + this.isBlinking = true; + this.blinkInterval = 1000; + this.smoothBlinking = false; + + this.cursors = []; + this.cursor = this.addCursor(); + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.$updateCursors = (isIE8 + ? this.$updateVisibility + : this.$updateOpacity).bind(this); +}; + +(function() { + + this.$updateVisibility = function(val) { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + cursors[i].style.visibility = val ? "" : "hidden"; + }; + this.$updateOpacity = function(val) { + var cursors = this.cursors; + for (var i = cursors.length; i--; ) + cursors[i].style.opacity = val ? "" : "0"; + }; + + + this.$padding = 0; + this.setPadding = function(padding) { + this.$padding = padding; + }; + + this.setSession = function(session) { + this.session = session; + }; + + this.setBlinking = function(blinking) { + if (blinking != this.isBlinking){ + this.isBlinking = blinking; + this.restartTimer(); + } + }; + + this.setBlinkInterval = function(blinkInterval) { + if (blinkInterval != this.blinkInterval){ + this.blinkInterval = blinkInterval; + this.restartTimer(); + } + }; + + this.setSmoothBlinking = function(smoothBlinking) { + if (smoothBlinking != this.smoothBlinking && !isIE8) { + this.smoothBlinking = smoothBlinking; + dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); + this.$updateCursors(true); + this.$updateCursors = (this.$updateOpacity).bind(this); + this.restartTimer(); + } + }; + + this.addCursor = function() { + var el = dom.createElement("div"); + el.className = "ace_cursor"; + this.element.appendChild(el); + this.cursors.push(el); + return el; + }; + + this.removeCursor = function() { + if (this.cursors.length > 1) { + var el = this.cursors.pop(); + el.parentNode.removeChild(el); + return el; + } + }; + + this.hideCursor = function() { + this.isVisible = false; + dom.addCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.showCursor = function() { + this.isVisible = true; + dom.removeCssClass(this.element, "ace_hidden-cursors"); + this.restartTimer(); + }; + + this.restartTimer = function() { + var update = this.$updateCursors; + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + if (this.smoothBlinking) { + dom.removeCssClass(this.element, "ace_smooth-blinking"); + } + + update(true); + + if (!this.isBlinking || !this.blinkInterval || !this.isVisible) + return; + + if (this.smoothBlinking) { + setTimeout(function(){ + dom.addCssClass(this.element, "ace_smooth-blinking"); + }.bind(this)); + } + + var blink = function(){ + this.timeoutId = setTimeout(function() { + update(false); + }, 0.6 * this.blinkInterval); + }.bind(this); + + this.intervalId = setInterval(function() { + update(true); + blink(); + }, this.blinkInterval); + + blink(); + }; + + this.getPixelPosition = function(position, onScreen) { + if (!this.config || !this.session) + return {left : 0, top : 0}; + + if (!position) + position = this.session.selection.getCursor(); + var pos = this.session.documentToScreenPosition(position); + var cursorLeft = this.$padding + pos.column * this.config.characterWidth; + var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) * + this.config.lineHeight; + + return {left : cursorLeft, top : cursorTop}; + }; + + this.update = function(config) { + this.config = config; + + var selections = this.session.$selectionMarkers; + var i = 0, cursorIndex = 0; + + if (selections === undefined || selections.length === 0){ + selections = [{cursor: null}]; + } + + for (var i = 0, n = selections.length; i < n; i++) { + var pixelPos = this.getPixelPosition(selections[i].cursor, true); + if ((pixelPos.top > config.height + config.offset || + pixelPos.top < 0) && i > 1) { + continue; + } + + var style = (this.cursors[cursorIndex++] || this.addCursor()).style; + + if (!this.drawCursor) { + style.left = pixelPos.left + "px"; + style.top = pixelPos.top + "px"; + style.width = config.characterWidth + "px"; + style.height = config.lineHeight + "px"; + } else { + this.drawCursor(style, pixelPos, config, selections[i], this.session); + } + } + while (this.cursors.length > cursorIndex) + this.removeCursor(); + + var overwrite = this.session.getOverwrite(); + this.$setOverwrite(overwrite); + this.$pixelPos = pixelPos; + this.restartTimer(); + }; + + this.drawCursor = null; + + this.$setOverwrite = function(overwrite) { + if (overwrite != this.overwrite) { + this.overwrite = overwrite; + if (overwrite) + dom.addCssClass(this.element, "ace_overwrite-cursors"); + else + dom.removeCssClass(this.element, "ace_overwrite-cursors"); + } + }; + + this.destroy = function() { + clearInterval(this.intervalId); + clearTimeout(this.timeoutId); + }; + +}).call(Cursor.prototype); + +exports.Cursor = Cursor; + +}); + +ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var event = require("./lib/event"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var ScrollBar = function(parent) { + this.element = dom.createElement("div"); + this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; + + this.inner = dom.createElement("div"); + this.inner.className = "ace_scrollbar-inner"; + this.element.appendChild(this.inner); + + parent.appendChild(this.element); + + this.setVisible(false); + this.skipEvent = false; + + event.addListener(this.element, "scroll", this.onScroll.bind(this)); + event.addListener(this.element, "mousedown", event.preventDefault); +}; + +(function() { + oop.implement(this, EventEmitter); + + this.setVisible = function(isVisible) { + this.element.style.display = isVisible ? "" : "none"; + this.isVisible = isVisible; + }; +}).call(ScrollBar.prototype); +var VScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollTop = 0; + renderer.$scrollbarWidth = + this.width = dom.scrollbarWidth(parent.ownerDocument); + this.inner.style.width = + this.element.style.width = (this.width || 15) + 5 + "px"; +}; + +oop.inherits(VScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-v'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollTop = this.element.scrollTop; + this._emit("scroll", {data: this.scrollTop}); + } + this.skipEvent = false; + }; + this.getWidth = function() { + return this.isVisible ? this.width : 0; + }; + this.setHeight = function(height) { + this.element.style.height = height + "px"; + }; + this.setInnerHeight = function(height) { + this.inner.style.height = height + "px"; + }; + this.setScrollHeight = function(height) { + this.inner.style.height = height + "px"; + }; + this.setScrollTop = function(scrollTop) { + if (this.scrollTop != scrollTop) { + this.skipEvent = true; + this.scrollTop = this.element.scrollTop = scrollTop; + } + }; + +}).call(VScrollBar.prototype); +var HScrollBar = function(parent, renderer) { + ScrollBar.call(this, parent); + this.scrollLeft = 0; + this.height = renderer.$scrollbarWidth; + this.inner.style.height = + this.element.style.height = (this.height || 15) + 5 + "px"; +}; + +oop.inherits(HScrollBar, ScrollBar); + +(function() { + + this.classSuffix = '-h'; + this.onScroll = function() { + if (!this.skipEvent) { + this.scrollLeft = this.element.scrollLeft; + this._emit("scroll", {data: this.scrollLeft}); + } + this.skipEvent = false; + }; + this.getHeight = function() { + return this.isVisible ? this.height : 0; + }; + this.setWidth = function(width) { + this.element.style.width = width + "px"; + }; + this.setInnerWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollWidth = function(width) { + this.inner.style.width = width + "px"; + }; + this.setScrollLeft = function(scrollLeft) { + if (this.scrollLeft != scrollLeft) { + this.skipEvent = true; + this.scrollLeft = this.element.scrollLeft = scrollLeft; + } + }; + +}).call(HScrollBar.prototype); + + +exports.ScrollBar = VScrollBar; // backward compatibility +exports.ScrollBarV = VScrollBar; // backward compatibility +exports.ScrollBarH = HScrollBar; // backward compatibility + +exports.VScrollBar = VScrollBar; +exports.HScrollBar = HScrollBar; +}); + +ace.define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { +"use strict"; + +var event = require("./lib/event"); + + +var RenderLoop = function(onRender, win) { + this.onRender = onRender; + this.pending = false; + this.changes = 0; + this.window = win || window; +}; + +(function() { + + + this.schedule = function(change) { + this.changes = this.changes | change; + if (!this.pending && this.changes) { + this.pending = true; + var _self = this; + event.nextFrame(function() { + _self.pending = false; + var changes; + while (changes = _self.changes) { + _self.changes = 0; + _self.onRender(changes); + } + }, this.window); + } + }; + +}).call(RenderLoop.prototype); + +exports.RenderLoop = RenderLoop; +}); + +ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { + +var oop = require("../lib/oop"); +var dom = require("../lib/dom"); +var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; + +var CHAR_COUNT = 0; + +var FontMetrics = exports.FontMetrics = function(parentEl) { + this.el = dom.createElement("div"); + this.$setMeasureNodeStyles(this.el.style, true); + + this.$main = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$main.style); + + this.$measureNode = dom.createElement("div"); + this.$setMeasureNodeStyles(this.$measureNode.style); + + + this.el.appendChild(this.$main); + this.el.appendChild(this.$measureNode); + parentEl.appendChild(this.el); + + if (!CHAR_COUNT) + this.$testFractionalRect(); + this.$measureNode.innerHTML = lang.stringRepeat("X", CHAR_COUNT); + + this.$characterSize = {width: 0, height: 0}; + this.checkForSizeChanges(); +}; + +(function() { + + oop.implement(this, EventEmitter); + + this.$characterSize = {width: 0, height: 0}; + + this.$testFractionalRect = function() { + var el = dom.createElement("div"); + this.$setMeasureNodeStyles(el.style); + el.style.width = "0.2px"; + document.documentElement.appendChild(el); + var w = el.getBoundingClientRect().width; + if (w > 0 && w < 1) + CHAR_COUNT = 50; + else + CHAR_COUNT = 100; + el.parentNode.removeChild(el); + }; + + this.$setMeasureNodeStyles = function(style, isRoot) { + style.width = style.height = "auto"; + style.left = style.top = "0px"; + style.visibility = "hidden"; + style.position = "absolute"; + style.whiteSpace = "pre"; + + if (useragent.isIE < 8) { + style["font-family"] = "inherit"; + } else { + style.font = "inherit"; + } + style.overflow = isRoot ? "hidden" : "visible"; + }; + + this.checkForSizeChanges = function() { + var size = this.$measureSizes(); + if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) { + this.$measureNode.style.fontWeight = "bold"; + var boldSize = this.$measureSizes(); + this.$measureNode.style.fontWeight = ""; + this.$characterSize = size; + this.charSizes = Object.create(null); + this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height; + this._emit("changeCharacterSize", {data: size}); + } + }; + + this.$pollSizeChanges = function() { + if (this.$pollSizeChangesTimer) + return this.$pollSizeChangesTimer; + var self = this; + return this.$pollSizeChangesTimer = setInterval(function() { + self.checkForSizeChanges(); + }, 500); + }; + + this.setPolling = function(val) { + if (val) { + this.$pollSizeChanges(); + } else if (this.$pollSizeChangesTimer) { + clearInterval(this.$pollSizeChangesTimer); + this.$pollSizeChangesTimer = 0; + } + }; + + this.$measureSizes = function() { + if (CHAR_COUNT === 50) { + var rect = null; + try { + rect = this.$measureNode.getBoundingClientRect(); + } catch(e) { + rect = {width: 0, height:0 }; + } + var size = { + height: rect.height, + width: rect.width / CHAR_COUNT + }; + } else { + var size = { + height: this.$measureNode.clientHeight, + width: this.$measureNode.clientWidth / CHAR_COUNT + }; + } + if (size.width === 0 || size.height === 0) + return null; + return size; + }; + + this.$measureCharWidth = function(ch) { + this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT); + var rect = this.$main.getBoundingClientRect(); + return rect.width / CHAR_COUNT; + }; + + this.getCharacterWidth = function(ch) { + var w = this.charSizes[ch]; + if (w === undefined) { + w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; + } + return w; + }; + + this.destroy = function() { + clearInterval(this.$pollSizeChangesTimer); + if (this.el && this.el.parentNode) + this.el.parentNode.removeChild(this.el); + }; + +}).call(FontMetrics.prototype); + +}); + +ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var config = require("./config"); +var useragent = require("./lib/useragent"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var HScrollBar = require("./scrollbar").HScrollBar; +var VScrollBar = require("./scrollbar").VScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var FontMetrics = require("./layer/font_metrics").FontMetrics; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = ".ace_editor {\ +position: relative;\ +overflow: hidden;\ +font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ +direction: ltr;\ +}\ +.ace_scroller {\ +position: absolute;\ +overflow: hidden;\ +top: 0;\ +bottom: 0;\ +background-color: inherit;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +cursor: text;\ +}\ +.ace_content {\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +min-width: 100%;\ +}\ +.ace_dragging .ace_scroller:before{\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +bottom: 0;\ +content: '';\ +background: rgba(250, 250, 250, 0.01);\ +z-index: 1000;\ +}\ +.ace_dragging.ace_dark .ace_scroller:before{\ +background: rgba(0, 0, 0, 0.01);\ +}\ +.ace_selecting, .ace_selecting * {\ +cursor: text !important;\ +}\ +.ace_gutter {\ +position: absolute;\ +overflow : hidden;\ +width: auto;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +cursor: default;\ +z-index: 4;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +}\ +.ace_gutter-active-line {\ +position: absolute;\ +left: 0;\ +right: 0;\ +}\ +.ace_scroller.ace_scroll-left {\ +box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ +}\ +.ace_gutter-cell {\ +padding-left: 19px;\ +padding-right: 6px;\ +background-repeat: no-repeat;\ +}\ +.ace_gutter-cell.ace_error {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_warning {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ +background-position: 2px center;\ +}\ +.ace_dark .ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ +}\ +.ace_scrollbar {\ +position: absolute;\ +right: 0;\ +bottom: 0;\ +z-index: 6;\ +}\ +.ace_scrollbar-inner {\ +position: absolute;\ +cursor: text;\ +left: 0;\ +top: 0;\ +}\ +.ace_scrollbar-v{\ +overflow-x: hidden;\ +overflow-y: scroll;\ +top: 0;\ +}\ +.ace_scrollbar-h {\ +overflow-x: scroll;\ +overflow-y: hidden;\ +left: 0;\ +}\ +.ace_print-margin {\ +position: absolute;\ +height: 100%;\ +}\ +.ace_text-input {\ +position: absolute;\ +z-index: 0;\ +width: 0.5em;\ +height: 1em;\ +opacity: 0;\ +background: transparent;\ +-moz-appearance: none;\ +appearance: none;\ +border: none;\ +resize: none;\ +outline: none;\ +overflow: hidden;\ +font: inherit;\ +padding: 0 1px;\ +margin: 0 -1px;\ +text-indent: -1em;\ +-ms-user-select: text;\ +-moz-user-select: text;\ +-webkit-user-select: text;\ +user-select: text;\ +white-space: pre!important;\ +}\ +.ace_text-input.ace_composition {\ +background: inherit;\ +color: inherit;\ +z-index: 1000;\ +opacity: 1;\ +text-indent: 0;\ +}\ +.ace_layer {\ +z-index: 1;\ +position: absolute;\ +overflow: hidden;\ +word-wrap: normal;\ +white-space: pre;\ +height: 100%;\ +width: 100%;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +pointer-events: none;\ +}\ +.ace_gutter-layer {\ +position: relative;\ +width: auto;\ +text-align: right;\ +pointer-events: auto;\ +}\ +.ace_text-layer {\ +font: inherit !important;\ +}\ +.ace_cjk {\ +display: inline-block;\ +text-align: center;\ +}\ +.ace_cursor-layer {\ +z-index: 4;\ +}\ +.ace_cursor {\ +z-index: 4;\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +border-left: 2px solid;\ +transform: translatez(0);\ +}\ +.ace_slim-cursors .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_overwrite-cursors .ace_cursor {\ +border-left-width: 0;\ +border-bottom: 1px solid;\ +}\ +.ace_hidden-cursors .ace_cursor {\ +opacity: 0.2;\ +}\ +.ace_smooth-blinking .ace_cursor {\ +-webkit-transition: opacity 0.18s;\ +transition: opacity 0.18s;\ +}\ +.ace_editor.ace_multiselect .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ +position: absolute;\ +z-index: 3;\ +}\ +.ace_marker-layer .ace_selection {\ +position: absolute;\ +z-index: 5;\ +}\ +.ace_marker-layer .ace_bracket {\ +position: absolute;\ +z-index: 6;\ +}\ +.ace_marker-layer .ace_active-line {\ +position: absolute;\ +z-index: 2;\ +}\ +.ace_marker-layer .ace_selected-word {\ +position: absolute;\ +z-index: 4;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +}\ +.ace_line .ace_fold {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +display: inline-block;\ +height: 11px;\ +margin-top: -2px;\ +vertical-align: middle;\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +color: transparent;\ +border: 1px solid black;\ +border-radius: 2px;\ +cursor: pointer;\ +pointer-events: auto;\ +}\ +.ace_dark .ace_fold {\ +}\ +.ace_fold:hover{\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ +}\ +.ace_tooltip {\ +background-color: #FFF;\ +background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\ +background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ +border: 1px solid gray;\ +border-radius: 1px;\ +box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ +color: black;\ +max-width: 100%;\ +padding: 3px 4px;\ +position: fixed;\ +z-index: 999999;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +cursor: default;\ +white-space: pre;\ +word-wrap: break-word;\ +line-height: normal;\ +font-style: normal;\ +font-weight: normal;\ +letter-spacing: normal;\ +pointer-events: none;\ +}\ +.ace_folding-enabled > .ace_gutter-cell {\ +padding-right: 13px;\ +}\ +.ace_fold-widget {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +margin: 0 -12px 0 1px;\ +display: none;\ +width: 11px;\ +vertical-align: top;\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: center;\ +border-radius: 3px;\ +border: 1px solid transparent;\ +cursor: pointer;\ +}\ +.ace_folding-enabled .ace_fold-widget {\ +display: inline-block; \ +}\ +.ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ +}\ +.ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ +}\ +.ace_fold-widget:hover {\ +border: 1px solid rgba(0, 0, 0, 0.3);\ +background-color: rgba(255, 255, 255, 0.2);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +}\ +.ace_fold-widget:active {\ +border: 1px solid rgba(0, 0, 0, 0.4);\ +background-color: rgba(0, 0, 0, 0.05);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +}\ +.ace_dark .ace_fold-widget {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ +}\ +.ace_dark .ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget:hover {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +background-color: rgba(255, 255, 255, 0.1);\ +}\ +.ace_dark .ace_fold-widget:active {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +}\ +.ace_fold-widget.ace_invalid {\ +background-color: #FFB4B4;\ +border-color: #DE5555;\ +}\ +.ace_fade-fold-widgets .ace_fold-widget {\ +-webkit-transition: opacity 0.4s ease 0.05s;\ +transition: opacity 0.4s ease 0.05s;\ +opacity: 0;\ +}\ +.ace_fade-fold-widgets:hover .ace_fold-widget {\ +-webkit-transition: opacity 0.05s ease 0.05s;\ +transition: opacity 0.05s ease 0.05s;\ +opacity:1;\ +}\ +.ace_underline {\ +text-decoration: underline;\ +}\ +.ace_bold {\ +font-weight: bold;\ +}\ +.ace_nobold .ace_bold {\ +font-weight: normal;\ +}\ +.ace_italic {\ +font-style: italic;\ +}\ +.ace_error-marker {\ +background-color: rgba(255, 0, 0,0.2);\ +position: absolute;\ +z-index: 9;\ +}\ +.ace_highlight-marker {\ +background-color: rgba(255, 255, 0,0.2);\ +position: absolute;\ +z-index: 8;\ +}\ +.ace_br1 {border-top-left-radius : 3px;}\ +.ace_br2 {border-top-right-radius : 3px;}\ +.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ +.ace_br4 {border-bottom-right-radius: 3px;}\ +.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ +.ace_br8 {border-bottom-left-radius : 3px;}\ +.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +"; + +dom.importCssString(editorCss, "ace_editor.css"); + +var VirtualRenderer = function(container, theme) { + var _self = this; + + this.container = container || dom.createElement("div"); + this.$keepTextAreaAtCursor = !useragent.isOldIE; + + dom.addCssClass(this.container, "ace_editor"); + + this.setTheme(theme); + + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + + this.$markerBack = new MarkerLayer(this.content); + + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + + this.$markerFront = new MarkerLayer(this.content); + + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + + this.scrollTop = 0; + this.scrollLeft = 0; + + this.cursorPos = { + row : 0, + column : 0 + }; + + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.addEventListener("changeCharacterSize", function(e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + + this.layerConfig = { + width : 1, + padding : 0, + firstRow : 0, + firstRowScreen: 0, + lastRow : 0, + lineHeight : 0, + characterWidth : 0, + minHeight : 1, + maxHeight : 1, + offset : 0, + height : 1, + gutterOffset: 1 + }; + + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + + this.$loop = new RenderLoop( + this.$renderChanges.bind(this), + this.container.ownerDocument.defaultView + ); + this.$loop.schedule(this.CHANGE_FULL); + + this.updateCharacterSize(); + this.setPadding(4); + config.resetOptions(this); + config._emit("renderer", this); +}; + +(function() { + + this.CHANGE_CURSOR = 1; + this.CHANGE_MARKER = 2; + this.CHANGE_GUTTER = 4; + this.CHANGE_SCROLL = 8; + this.CHANGE_LINES = 16; + this.CHANGE_TEXT = 32; + this.CHANGE_SIZE = 64; + this.CHANGE_MARKER_BACK = 128; + this.CHANGE_MARKER_FRONT = 256; + this.CHANGE_FULL = 512; + this.CHANGE_H_SCROLL = 1024; + + oop.implement(this, EventEmitter); + + this.updateCharacterSize = function() { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + + this.layerConfig.characterWidth = + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.layerConfig.lineHeight = + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + }; + this.setSession = function(session) { + if (this.session) + this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); + + this.session = session; + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) + session.setScrollTop(-this.scrollMargin.top); + + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + if (!session) + return; + + this.$loop.schedule(this.CHANGE_FULL); + this.session.$setFontMetrics(this.$fontMetrics); + + this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); + this.onChangeNewLineMode() + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + }; + this.updateLines = function(firstRow, lastRow, force) { + if (lastRow === undefined) + lastRow = Infinity; + + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + if (this.$changedLines.lastRow < this.layerConfig.firstRow) { + if (force) + this.$changedLines.lastRow = this.layerConfig.lastRow; + else + return; + } + if (this.$changedLines.firstRow > this.layerConfig.lastRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + + this.onChangeNewLineMode = function() { + this.$loop.schedule(this.CHANGE_TEXT); + this.$textLayer.$updateEolChar(); + }; + + this.onChangeTabSize = function() { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + this.updateText = function() { + this.$loop.schedule(this.CHANGE_TEXT); + }; + this.updateFull = function(force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + this.updateFontSize = function() { + this.$textLayer.checkForSizeChanges(); + }; + + this.$changes = 0; + this.$updateSizeAsync = function() { + if (this.$loop.pending) + this.$size.$dirty = true; + else + this.onResize(); + }; + this.onResize = function(force, gutterWidth, width, height) { + if (this.resizing > 2) + return; + else if (this.resizing > 0) + this.resizing++; + else + this.resizing = force ? 1 : 0; + var el = this.container; + if (!height) + height = el.clientHeight || el.scrollHeight; + if (!width) + width = el.clientWidth || el.scrollWidth; + var changes = this.$updateCachedSize(force, gutterWidth, width, height); + + + if (!this.$size.scrollerHeight || (!width && !height)) + return this.resizing = 0; + + if (force) + this.$gutterLayer.$padding = null; + + if (force) + this.$renderChanges(changes | this.$changes, true); + else + this.$loop.schedule(changes | this.$changes); + + if (this.resizing) + this.resizing = 0; + this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null; + }; + + this.$updateCachedSize = function(force, gutterWidth, width, height) { + height -= (this.$extraHeight || 0); + var changes = 0; + var size = this.$size; + var oldSize = { + width: size.width, + height: size.height, + scrollerHeight: size.scrollerHeight, + scrollerWidth: size.scrollerWidth + }; + if (height && (force || size.height != height)) { + size.height = height; + changes |= this.CHANGE_SIZE; + + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; + + changes = changes | this.CHANGE_SCROLL; + } + + if (width && (force || size.width != width)) { + changes |= this.CHANGE_SIZE; + size.width = width; + + if (gutterWidth == null) + gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + + this.gutterWidth = gutterWidth; + + this.scrollBarH.element.style.left = + this.scroller.style.left = gutterWidth + "px"; + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); + + this.scrollBarH.element.style.right = + this.scroller.style.right = this.scrollBarV.getWidth() + "px"; + this.scroller.style.bottom = this.scrollBarH.getHeight() + "px"; + + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) + changes |= this.CHANGE_FULL; + } + + size.$dirty = !width || !height; + + if (changes) + this._signal("resize", oldSize); + + return changes; + }; + + this.onGutterResize = function() { + var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + if (gutterWidth != this.gutterWidth) + this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); + + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { + this.$loop.schedule(this.CHANGE_FULL); + } else if (this.$size.$dirty) { + this.$loop.schedule(this.CHANGE_FULL); + } else { + this.$computeLayerConfig(); + this.$loop.schedule(this.CHANGE_MARKER); + } + }; + this.adjustWrapLimit = function() { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + this.setAnimatedScroll = function(shouldAnimate){ + this.setOption("animatedScroll", shouldAnimate); + }; + this.getAnimatedScroll = function() { + return this.$animatedScroll; + }; + this.setShowInvisibles = function(showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + }; + this.getShowInvisibles = function() { + return this.getOption("showInvisibles"); + }; + this.getDisplayIndentGuides = function() { + return this.getOption("displayIndentGuides"); + }; + + this.setDisplayIndentGuides = function(display) { + this.setOption("displayIndentGuides", display); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.getOption("showPrintMargin"); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.setOption("printMarginColumn", showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.getOption("printMarginColumn"); + }; + this.getShowGutter = function(){ + return this.getOption("showGutter"); + }; + this.setShowGutter = function(show){ + return this.setOption("showGutter", show); + }; + + this.getFadeFoldWidgets = function(){ + return this.getOption("fadeFoldWidgets") + }; + + this.setFadeFoldWidgets = function(show) { + this.setOption("fadeFoldWidgets", show); + }; + + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + + this.$updateGutterLineHighlight = function() { + var pos = this.$cursorLayer.$pixelPos; + var height = this.layerConfig.lineHeight; + if (this.session.getUseWrapMode()) { + var cursor = this.session.selection.getCursor(); + cursor.column = 0; + pos = this.$cursorLayer.getPixelPosition(cursor, true); + height *= this.session.getRowLength(cursor.row); + } + this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; + this.$gutterLineHighlight.style.height = height + "px"; + }; + + this.$updatePrintMargin = function() { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + + var style = this.$printMarginEl.style; + style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + this.getContainerElement = function() { + return this.container; + }; + this.getMouseEventTarget = function() { + return this.scroller; + }; + this.getTextAreaContainer = function() { + return this.container; + }; + this.$moveTextAreaToCursor = function() { + if (!this.$keepTextAreaAtCursor) + return; + var config = this.layerConfig; + var posTop = this.$cursorLayer.$pixelPos.top; + var posLeft = this.$cursorLayer.$pixelPos.left; + posTop -= config.offset; + + var style = this.textarea.style; + var h = this.lineHeight; + if (posTop < 0 || posTop > config.height - h) { + style.top = style.left = "0"; + return; + } + + var w = this.characterWidth; + if (this.$composition) { + var val = this.textarea.value.replace(/^\x01+/, ""); + w *= (this.session.$getStringScreenWidth(val)[0]+2); + h += 2; + } + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + + posLeft += this.gutterWidth; + style.height = h + "px"; + style.width = w + "px"; + style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px"; + style.top = Math.min(posTop, this.$size.height - h) + "px"; + }; + this.getFirstVisibleRow = function() { + return this.layerConfig.firstRow; + }; + this.getFirstFullyVisibleRow = function() { + return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); + }; + this.getLastFullyVisibleRow = function() { + var config = this.layerConfig; + var lastRow = config.lastRow + var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; + if (top - this.session.getScrollTop() > config.height - config.lineHeight) + return lastRow - 1; + return lastRow; + }; + this.getLastVisibleRow = function() { + return this.layerConfig.lastRow; + }; + + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + + this.setScrollMargin = function(top, bottom, left, right) { + var sm = this.scrollMargin; + sm.top = top|0; + sm.bottom = bottom|0; + sm.right = right|0; + sm.left = left|0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + if (sm.top && this.scrollTop <= 0 && this.session) + this.session.setScrollTop(-sm.top); + this.updateFull(); + }; + this.getHScrollBarAlwaysVisible = function() { + return this.$hScrollBarAlwaysVisible; + }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + this.getVScrollBarAlwaysVisible = function() { + return this.$vScrollBarAlwaysVisible; + }; + this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("vScrollBarAlwaysVisible", alwaysVisible); + }; + + this.$updateScrollBarV = function() { + var scrollHeight = this.layerConfig.maxHeight; + var scrollerHeight = this.$size.scrollerHeight; + if (!this.$maxLines && this.$scrollPastEnd) { + scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd; + if (this.scrollTop > scrollHeight - scrollerHeight) { + scrollHeight = this.scrollTop + scrollerHeight; + this.scrollBarV.scrollTop = null; + } + } + this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + }; + this.$updateScrollBarH = function() { + this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); + this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + }; + + this.$frozen = false; + this.freeze = function() { + this.$frozen = true; + }; + + this.unfreeze = function() { + this.$frozen = false; + }; + + this.$renderChanges = function(changes, force) { + if (this.$changes) { + changes |= this.$changes; + this.$changes = 0; + } + if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { + this.$changes |= changes; + return; + } + if (this.$size.$dirty) { + this.$changes |= changes; + return this.onResize(true); + } + if (!this.lineHeight) { + this.$textLayer.checkForSizeChanges(); + } + + this._signal("beforeRender"); + var config = this.layerConfig; + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL || + changes & this.CHANGE_H_SCROLL + ) { + changes |= this.$computeLayerConfig(); + if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { + var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + if (st > 0) { + this.scrollTop = st; + changes = changes | this.CHANGE_SCROLL; + changes |= this.$computeLayerConfig(); + } + } + config = this.layerConfig; + this.$updateScrollBarV(); + if (changes & this.CHANGE_H_SCROLL) + this.$updateScrollBarH(); + this.$gutterLayer.element.style.marginTop = (-config.offset) + "px"; + this.content.style.marginTop = (-config.offset) + "px"; + this.content.style.width = config.width + 2 * this.$padding + "px"; + this.content.style.height = config.minHeight + "px"; + } + if (changes & this.CHANGE_H_SCROLL) { + this.content.style.marginLeft = -this.scrollLeft + "px"; + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + } + if (changes & this.CHANGE_FULL) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this._signal("afterRender"); + return; + } + if (changes & this.CHANGE_SCROLL) { + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(config); + else + this.$textLayer.scrollLines(config); + + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this.$moveTextAreaToCursor(); + this._signal("afterRender"); + return; + } + + if (changes & this.CHANGE_TEXT) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(config); + } + + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(config); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(config); + } + + this._signal("afterRender"); + }; + + + this.$autosize = function() { + var height = this.session.getScreenLength() * this.lineHeight; + var maxHeight = this.$maxLines * this.lineHeight; + var desiredHeight = Math.max( + (this.$minLines||1) * this.lineHeight, + Math.min(maxHeight, height) + ) + this.scrollMargin.v + (this.$extraHeight || 0); + if (this.$horizScroll) + desiredHeight += this.scrollBarH.getHeight(); + var vScroll = height > maxHeight; + + if (desiredHeight != this.desiredHeight || + this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { + if (vScroll != this.$vScroll) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var w = this.container.clientWidth; + this.container.style.height = desiredHeight + "px"; + this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); + this.desiredHeight = desiredHeight; + + this._signal("autosize"); + } + }; + + this.$computeLayerConfig = function() { + var session = this.session; + var size = this.$size; + + var hideScrollbars = size.height <= 2 * this.lineHeight; + var screenLines = this.session.getScreenLength(); + var maxHeight = screenLines * this.lineHeight; + + var longestLine = this.$getLongestLine(); + + var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || + size.scrollerWidth - longestLine - 2 * this.$padding < 0); + + var hScrollChanged = this.$horizScroll !== horizScroll; + if (hScrollChanged) { + this.$horizScroll = horizScroll; + this.scrollBarH.setVisible(horizScroll); + } + var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + + var offset = this.scrollTop % this.lineHeight; + var minHeight = size.scrollerHeight + this.lineHeight; + + var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd + ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd + : 0; + maxHeight += scrollPastEnd; + + var sm = this.scrollMargin; + this.session.setScrollTop(Math.max(-sm.top, + Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, + longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + + var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + var vScrollChanged = vScrollBefore !== vScroll; + if (vScrollChanged) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + + offset = this.scrollTop - firstRowScreen * lineHeight; + + var changes = 0; + if (this.layerConfig.width != longestLine) + changes = this.CHANGE_H_SCROLL; + if (hScrollChanged || vScrollChanged) { + changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); + this._signal("scrollbarVisibilityChanged"); + if (vScrollChanged) + longestLine = this.$getLongestLine(); + } + + this.layerConfig = { + width : longestLine, + padding : this.$padding, + firstRow : firstRow, + firstRowScreen: firstRowScreen, + lastRow : lastRow, + lineHeight : lineHeight, + characterWidth : this.characterWidth, + minHeight : minHeight, + maxHeight : maxHeight, + offset : offset, + gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)), + height : this.$size.scrollerHeight + }; + + return changes; + }; + + this.$updateLines = function() { + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + + var layerConfig = this.layerConfig; + + if (firstRow > layerConfig.lastRow + 1) { return; } + if (lastRow < layerConfig.firstRow) { return; } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + + this.$getLongestLine = function() { + var charCount = this.session.getScreenWidth(); + if (this.showInvisibles && !this.session.$useWrapMode) + charCount += 1; + + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + this.updateFrontMarkers = function() { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + this.$loop.schedule(this.CHANGE_MARKER_FRONT); + }; + this.updateBackMarkers = function() { + this.$markerBack.setMarkers(this.session.getMarkers()); + this.$loop.schedule(this.CHANGE_MARKER_BACK); + }; + this.addGutterDecoration = function(row, className){ + this.$gutterLayer.addGutterDecoration(row, className); + }; + this.removeGutterDecoration = function(row, className){ + this.$gutterLayer.removeGutterDecoration(row, className); + }; + this.updateBreakpoints = function(rows) { + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.setAnnotations = function(annotations) { + this.$gutterLayer.setAnnotations(annotations); + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.updateCursor = function() { + this.$loop.schedule(this.CHANGE_CURSOR); + }; + this.hideCursor = function() { + this.$cursorLayer.hideCursor(); + }; + this.showCursor = function() { + this.$cursorLayer.showCursor(); + }; + + this.scrollSelectionIntoView = function(anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + if (this.$size.scrollerHeight === 0) + return; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + + var left = pos.left; + var top = pos.top; + + var topMargin = $viewMargin && $viewMargin.top || 0; + var bottomMargin = $viewMargin && $viewMargin.bottom || 0; + + var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + + if (scrollTop + topMargin > top) { + if (offset && scrollTop + topMargin > top + this.lineHeight) + top -= offset * this.$size.scrollerHeight; + if (top === 0) + top = -this.scrollMargin.top; + this.session.setScrollTop(top); + } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { + if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) + top += offset * this.$size.scrollerHeight; + this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); + } + + var scrollLeft = this.scrollLeft; + + if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = -this.scrollMargin.left; + this.session.setScrollLeft(left); + } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { + this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); + } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { + this.session.setScrollLeft(0); + } + }; + this.getScrollTop = function() { + return this.session.getScrollTop(); + }; + this.getScrollLeft = function() { + return this.session.getScrollLeft(); + }; + this.getScrollTopRow = function() { + return this.scrollTop / this.lineHeight; + }; + this.getScrollBottomRow = function() { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + this.scrollToRow = function(row) { + this.session.setScrollTop(row * this.lineHeight); + }; + + this.alignCursor = function(cursor, alignment) { + if (typeof cursor == "number") + cursor = {row: cursor, column: 0}; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + + this.session.setScrollTop(offset); + return offset; + }; + + this.STEPS = 8; + this.$calcSteps = function(fromValue, toValue){ + var i = 0; + var l = this.STEPS; + var steps = []; + + var func = function(t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + + return steps; + }; + this.scrollToLine = function(line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + + this.animateScrolling = function(fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + + if (fromValue == toValue) + return; + + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } + } + + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; + + clearInterval(this.$timer); + + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + this.$timer = setInterval(function() { + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } else { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + callback && callback(); + } + }, 10); + }; + this.scrollToY = function(scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + this.scrollToX = function(scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + this.scrollTo = function(x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(y); + }; + this.scrollBy = function(deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + this.isScrollableBy = function(deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; + }; + + this.pixelToScreenCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = Math.round(offset); + + return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; + }; + + this.screenToTextCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.round( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + + var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; + + return this.session.screenToDocumentPosition(row, Math.max(col, 0)); + }; + this.textToScreenCoordinates = function(row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + + var x = this.$padding + Math.round(pos.column * this.characterWidth); + var y = pos.row * this.lineHeight; + + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + this.visualizeFocus = function() { + dom.addCssClass(this.container, "ace_focus"); + }; + this.visualizeBlur = function() { + dom.removeCssClass(this.container, "ace_focus"); + }; + this.showComposition = function(position) { + if (!this.$composition) + this.$composition = { + keepTextAreaAtCursor: this.$keepTextAreaAtCursor, + cssText: this.textarea.style.cssText + }; + + this.$keepTextAreaAtCursor = true; + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + }; + this.setCompositionText = function(text) { + this.$moveTextAreaToCursor(); + }; + this.hideComposition = function() { + if (!this.$composition) + return; + + dom.removeCssClass(this.textarea, "ace_composition"); + this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; + this.textarea.style.cssText = this.$composition.cssText; + this.$composition = null; + }; + this.setTheme = function(theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange',{theme:theme}); + + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } else { + afterLoad(theme); + } + + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module.cssClass) + return; + dom.importCssString( + module.cssText, + module.cssClass, + _self.container.ownerDocument + ); + + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + _self.$theme = module.cssClass; + + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + + _self._dispatchEvent('themeLoaded', {theme:module}); + cb && cb(); + } + }; + this.getTheme = function() { + return this.$themeId; + }; + this.setStyle = function(style, include) { + dom.setCssClass(this.container, style, include !== false); + }; + this.unsetStyle = function(style) { + dom.removeCssClass(this.container, style); + }; + + this.setCursorStyle = function(style) { + if (this.scroller.style.cursor != style) + this.scroller.style.cursor = style; + }; + this.setMouseCursor = function(cursorStyle) { + this.scroller.style.cursor = cursorStyle; + }; + this.destroy = function() { + this.$textLayer.destroy(); + this.$cursorLayer.destroy(); + }; + +}).call(VirtualRenderer.prototype); + + +config.defineOptions(VirtualRenderer.prototype, "renderer", { + animatedScroll: {initialValue: false}, + showInvisibles: { + set: function(value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function() { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function() { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function(val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function() { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function(show){ + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + fadeFoldWidgets: { + set: function(show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, + initialValue: true + }, + showLineNumbers: { + set: function(show) { + this.$gutterLayer.setShowLineNumbers(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function(show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightGutterLine: { + set: function(shouldHighlight) { + if (!this.$gutterLineHighlight) { + this.$gutterLineHighlight = dom.createElement("div"); + this.$gutterLineHighlight.className = "ace_gutter-active-line"; + this.$gutter.appendChild(this.$gutterLineHighlight); + return; + } + + this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; + if (this.$cursorLayer.$pixelPos) + this.$updateGutterLineHighlight(); + }, + initialValue: false, + value: true + }, + hScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function(size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function(name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function(val) { + this.updateFull(); + } + }, + minLines: { + set: function(val) { + this.updateFull(); + } + }, + scrollPastEnd: { + set: function(val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function(val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + theme: { + set: function(val) { this.setTheme(val) }, + get: function() { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + } +}); + +exports.VirtualRenderer = VirtualRenderer; +}); + +ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + try { + this.$worker = new Worker(workerUrl); + } catch(e) { + if (e instanceof window.DOMException) { + var blob = this.$workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + + this.$worker = new Worker(blobURL); + URL.revokeObjectURL(blobURL); + } else { + throw e; + } + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.onMessage = function(e) { + var msg = e.data; + switch(msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + } + }; + + this.reportError = function(err) { + window.console && console.error && console.error(err); + }; + + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; + + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) { + console.error(ex.stack); + } + }; + + this.attachToDocument = function(doc) { + if(this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener); + }; + + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); + } + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + }; + + this.$workerBlob = function(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } + }; + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.callbackId = 1; + this.callbacks = {}; + this.messageBuffer = []; + + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); + var _self = this; + + this.$worker = {}; + this.$worker.terminate = function() {}; + this.$worker.postMessage = function(e) { + _self.messageBuffer.push(e); + if (main) { + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }; + this.setEmitSync = function(val) { emitSync = val }; + + var processNext = function() { + var msg = _self.messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + _self.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (_self.messageBuffer.length) + processNext(); + }); +}; + +UIWorkerClient.prototype = WorkerClient.prototype; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; + +}); + +ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); + +var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate); + this.$others = others; + + this.$onCursorChange = function() { + setTimeout(function() { + _self.onCursorChange(); + }); + }; + + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; + this.$undoStackDepth = undoStack.length; + this.setup(); + + session.selection.on("changeCursor", this.$onCursorChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setup = function() { + var _self = this; + var doc = this.doc; + var session = this.session; + + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function(other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + this.showOtherMarkers = function() { + if (this.othersActive) return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function(anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); + }); + }; + this.hideOtherMarkers = function() { + if (!this.othersActive) return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + this.onUpdate = function(delta) { + if (this.$updating) + return this.updateAnchors(delta); + + var range = delta; + if (range.start.row !== range.end.row) return; + if (range.start.row !== this.pos.row) return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + + this.updateAnchors(delta); + + if (inMainRange) + this.length += lengthDiff; + + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.insertMergedLines(newPos, delta.lines); + } + } else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + } + + this.$updating = false; + this.updateMarkers(); + }; + + this.updateAnchors = function(delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + + this.updateMarkers = function() { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function(pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); + }; + + this.onCursorChange = function(event) { + if (this.$updating || !this.session) return; + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + this.detach = function() { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.removeEventListener("change", this.$onUpdate); + this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + this.cancel = function() { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(true); + } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); + }; +}).call(PlaceHolder.prototype); + + +exports.PlaceHolder = PlaceHolder; +}); + +ace.define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} + +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + + if (ctrl && useragent.isMac) + button = ev.button; + + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + + if (button !== 0) + return; + + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function(e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; + } else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; + } + } + + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + + var oldRange = selection.rangeList.rangeAtPoint(pos); + + + editor.$blockScrolling++; + editor.inVirtualSelectionMode = true; + + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function() { + var tmpSel = selection.toOrientedRange(); + + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.$blockScrolling--; + editor.inVirtualSelectionMode = false; + }); + + } else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function() { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); + + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + + editor.$blockScrolling++; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + editor.$blockScrolling--; + }; + editor.$blockScrolling++; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); + } + + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + editor.$blockScrolling--; + + screenCursor = {row: -1, column: -1}; + + var onMouseSelectionEnd = function(e) { + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + editor.$blockScrolling++; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + editor.$blockScrolling--; + }; + + var onSelectionInterval = blockSelect; + + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function() {onSelectionInterval();}, 20); + + return e.preventDefault(); + } +} + + +exports.onMouseDown = onMouseDown; + +}); + +ace.define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { +exports.defaultCommands = [{ + name: "addCursorAbove", + exec: function(editor) { editor.selectMoreLines(-1); }, + bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelow", + exec: function(editor) { editor.selectMoreLines(1); }, + bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorAboveSkipCurrent", + exec: function(editor) { editor.selectMoreLines(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelowSkipCurrent", + exec: function(editor) { editor.selectMoreLines(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreBefore", + exec: function(editor) { editor.selectMore(-1); }, + bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreAfter", + exec: function(editor) { editor.selectMore(1); }, + bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextBefore", + exec: function(editor) { editor.selectMore(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextAfter", + exec: function(editor) { editor.selectMore(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "splitIntoLines", + exec: function(editor) { editor.multiSelect.splitIntoLines(); }, + bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, + readOnly: true +}, { + name: "alignCursors", + exec: function(editor) { editor.alignCursors(); }, + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, + scrollIntoView: "cursor" +}, { + name: "findAll", + exec: function(editor) { editor.findAll(); }, + bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, + scrollIntoView: "cursor", + readOnly: true +}]; +exports.multiSelectCommands = [{ + name: "singleSelection", + bindKey: "esc", + exec: function(editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function(editor) {return editor && editor.inMultiSelectMode} +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +ace.define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { + +var RangeList = require("./range_list").RangeList; +var Range = require("./range").Range; +var Selection = require("./selection").Selection; +var onMouseDown = require("./mouse/multi_select_handler").onMouseDown; +var event = require("./lib/event"); +var lang = require("./lib/lang"); +var commands = require("./commands/multi_select_commands"); +exports.commands = commands.defaultCommands.concat(commands.multiSelectCommands); +var Search = require("./search").Search; +var search = new Search(); + +function find(session, needle, dir) { + search.$options.wrap = true; + search.$options.needle = needle; + search.$options.backwards = dir == -1; + return search.find(session); +} +var EditSession = require("./edit_session").EditSession; +(function() { + this.getSelectionMarkers = function() { + return this.$selectionMarkers; + }; +}).call(EditSession.prototype); +(function() { + this.ranges = null; + this.rangeList = null; + this.addRange = function(range, $blockChangeEvents) { + if (!range) + return; + + if (!this.inMultiSelectMode && this.rangeCount === 0) { + var oldRange = this.toOrientedRange(); + this.rangeList.add(oldRange); + this.rangeList.add(range); + if (this.rangeList.ranges.length != 2) { + this.rangeList.removeAll(); + return $blockChangeEvents || this.fromOrientedRange(range); + } + this.rangeList.removeAll(); + this.rangeList.add(oldRange); + this.$onAddRange(oldRange); + } + + if (!range.cursor) + range.cursor = range.end; + + var removed = this.rangeList.add(range); + + this.$onAddRange(range); + + if (removed.length) + this.$onRemoveRange(removed); + + if (this.rangeCount > 1 && !this.inMultiSelectMode) { + this._signal("multiSelect"); + this.inMultiSelectMode = true; + this.session.$undoSelect = false; + this.rangeList.attach(this.session); + } + + return $blockChangeEvents || this.fromOrientedRange(range); + }; + + this.toSingleRange = function(range) { + range = range || this.ranges[0]; + var removed = this.rangeList.removeAll(); + if (removed.length) + this.$onRemoveRange(removed); + + range && this.fromOrientedRange(range); + }; + this.substractPoint = function(pos) { + var removed = this.rangeList.substractPoint(pos); + if (removed) { + this.$onRemoveRange(removed); + return removed[0]; + } + }; + this.mergeOverlappingRanges = function() { + var removed = this.rangeList.merge(); + if (removed.length) + this.$onRemoveRange(removed); + else if(this.ranges[0]) + this.fromOrientedRange(this.ranges[0]); + }; + + this.$onAddRange = function(range) { + this.rangeCount = this.rangeList.ranges.length; + this.ranges.unshift(range); + this._signal("addRange", {range: range}); + }; + + this.$onRemoveRange = function(removed) { + this.rangeCount = this.rangeList.ranges.length; + if (this.rangeCount == 1 && this.inMultiSelectMode) { + var lastRange = this.rangeList.ranges.pop(); + removed.push(lastRange); + this.rangeCount = 0; + } + + for (var i = removed.length; i--; ) { + var index = this.ranges.indexOf(removed[i]); + this.ranges.splice(index, 1); + } + + this._signal("removeRange", {ranges: removed}); + + if (this.rangeCount === 0 && this.inMultiSelectMode) { + this.inMultiSelectMode = false; + this._signal("singleSelect"); + this.session.$undoSelect = true; + this.rangeList.detach(this.session); + } + + lastRange = lastRange || this.ranges[0]; + if (lastRange && !lastRange.isEqual(this.getRange())) + this.fromOrientedRange(lastRange); + }; + this.$initRangeList = function() { + if (this.rangeList) + return; + + this.rangeList = new RangeList(); + this.ranges = []; + this.rangeCount = 0; + }; + this.getAllRanges = function() { + return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()]; + }; + + this.splitIntoLines = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var range = this.getRange(); + var isBackwards = this.isBackwards(); + var startRow = range.start.row; + var endRow = range.end.row; + if (startRow == endRow) { + if (isBackwards) + var start = range.end, end = range.start; + else + var start = range.start, end = range.end; + + this.addRange(Range.fromPoints(end, end)); + this.addRange(Range.fromPoints(start, start)); + return; + } + + var rectSel = []; + var r = this.getLineRange(startRow, true); + r.start.column = range.start.column; + rectSel.push(r); + + for (var i = startRow + 1; i < endRow; i++) + rectSel.push(this.getLineRange(i, true)); + + r = this.getLineRange(endRow, true); + r.end.column = range.end.column; + rectSel.push(r); + + rectSel.forEach(this.addRange, this); + } + }; + this.toggleBlockSelection = function () { + if (this.rangeCount > 1) { + var ranges = this.rangeList.ranges; + var lastRange = ranges[ranges.length - 1]; + var range = Range.fromPoints(ranges[0].start, lastRange.end); + + this.toSingleRange(); + this.setSelectionRange(range, lastRange.cursor == lastRange.start); + } else { + var cursor = this.session.documentToScreenPosition(this.selectionLead); + var anchor = this.session.documentToScreenPosition(this.selectionAnchor); + + var rectSel = this.rectangularRangeBlock(cursor, anchor); + rectSel.forEach(this.addRange, this); + } + }; + this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) { + var rectSel = []; + + var xBackwards = screenCursor.column < screenAnchor.column; + if (xBackwards) { + var startColumn = screenCursor.column; + var endColumn = screenAnchor.column; + } else { + var startColumn = screenAnchor.column; + var endColumn = screenCursor.column; + } + + var yBackwards = screenCursor.row < screenAnchor.row; + if (yBackwards) { + var startRow = screenCursor.row; + var endRow = screenAnchor.row; + } else { + var startRow = screenAnchor.row; + var endRow = screenCursor.row; + } + + if (startColumn < 0) + startColumn = 0; + if (startRow < 0) + startRow = 0; + + if (startRow == endRow) + includeEmptyLines = true; + + for (var row = startRow; row <= endRow; row++) { + var range = Range.fromPoints( + this.session.screenToDocumentPosition(row, startColumn), + this.session.screenToDocumentPosition(row, endColumn) + ); + if (range.isEmpty()) { + if (docEnd && isSamePoint(range.end, docEnd)) + break; + var docEnd = range.end; + } + range.cursor = xBackwards ? range.start : range.end; + rectSel.push(range); + } + + if (yBackwards) + rectSel.reverse(); + + if (!includeEmptyLines) { + var end = rectSel.length - 1; + while (rectSel[end].isEmpty() && end > 0) + end--; + if (end > 0) { + var start = 0; + while (rectSel[start].isEmpty()) + start++; + } + for (var i = end; i >= start; i--) { + if (rectSel[i].isEmpty()) + rectSel.splice(i, 1); + } + } + + return rectSel; + }; +}).call(Selection.prototype); +var Editor = require("./editor").Editor; +(function() { + this.updateSelectionMarkers = function() { + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + this.addSelectionMarker = function(orientedRange) { + if (!orientedRange.cursor) + orientedRange.cursor = orientedRange.end; + + var style = this.getSelectionStyle(); + orientedRange.marker = this.session.addMarker(orientedRange, "ace_selection", style); + + this.session.$selectionMarkers.push(orientedRange); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + return orientedRange; + }; + this.removeSelectionMarker = function(range) { + if (!range.marker) + return; + this.session.removeMarker(range.marker); + var index = this.session.$selectionMarkers.indexOf(range); + if (index != -1) + this.session.$selectionMarkers.splice(index, 1); + this.session.selectionMarkerCount = this.session.$selectionMarkers.length; + }; + + this.removeSelectionMarkers = function(ranges) { + var markerList = this.session.$selectionMarkers; + for (var i = ranges.length; i--; ) { + var range = ranges[i]; + if (!range.marker) + continue; + this.session.removeMarker(range.marker); + var index = markerList.indexOf(range); + if (index != -1) + markerList.splice(index, 1); + } + this.session.selectionMarkerCount = markerList.length; + }; + + this.$onAddRange = function(e) { + this.addSelectionMarker(e.range); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onRemoveRange = function(e) { + this.removeSelectionMarkers(e.ranges); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onMultiSelect = function(e) { + if (this.inMultiSelectMode) + return; + this.inMultiSelectMode = true; + + this.setStyle("ace_multiselect"); + this.keyBinding.addKeyboardHandler(commands.keyboardHandler); + this.commands.setDefaultHandler("exec", this.$onMultiSelectExec); + + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + }; + + this.$onSingleSelect = function(e) { + if (this.session.multiSelect.inVirtualMode) + return; + this.inMultiSelectMode = false; + + this.unsetStyle("ace_multiselect"); + this.keyBinding.removeKeyboardHandler(commands.keyboardHandler); + + this.commands.removeDefaultHandler("exec", this.$onMultiSelectExec); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + this._emit("changeSelection"); + }; + + this.$onMultiSelectExec = function(e) { + var command = e.command; + var editor = e.editor; + if (!editor.multiSelect) + return; + if (!command.multiSelectAction) { + var result = command.exec(editor, e.args || {}); + editor.multiSelect.addRange(editor.multiSelect.toOrientedRange()); + editor.multiSelect.mergeOverlappingRanges(); + } else if (command.multiSelectAction == "forEach") { + result = editor.forEachSelection(command, e.args); + } else if (command.multiSelectAction == "forEachLine") { + result = editor.forEachSelection(command, e.args, true); + } else if (command.multiSelectAction == "single") { + editor.exitMultiSelectMode(); + result = command.exec(editor, e.args || {}); + } else { + result = command.multiSelectAction(editor, e.args || {}); + } + return result; + }; + this.forEachSelection = function(cmd, args, options) { + if (this.inVirtualSelectionMode) + return; + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines + var session = this.session; + var selection = this.selection; + var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; + var result; + + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + + var reg = selection._eventRegistry; + selection._eventRegistry = {}; + + var tmpSel = new Selection(session); + this.inVirtualSelectionMode = true; + for (var i = ranges.length; i--;) { + if ($byLines) { + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) + i--; + } + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; + this.selection = session.selection = tmpSel; + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) + result = cmdResult; + tmpSel.toOrientedRange(ranges[i]); + } + tmpSel.detach(); + + this.selection = session.selection = selection; + this.inVirtualSelectionMode = false; + selection._eventRegistry = reg; + selection.mergeOverlappingRanges(); + + var anim = this.renderer.$scrollAnimation; + this.onCursorChange(); + this.onSelectionChange(); + if (anim && anim.from == anim.to) + this.renderer.animateScrolling(anim.from); + + return result; + }; + this.exitMultiSelectMode = function() { + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) + return; + this.multiSelect.toSingleRange(); + }; + + this.getSelectedText = function() { + var text = ""; + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var ranges = this.multiSelect.rangeList.ranges; + var buf = []; + for (var i = 0; i < ranges.length; i++) { + buf.push(this.session.getTextRange(ranges[i])); + } + var nl = this.session.getDocument().getNewLineCharacter(); + text = buf.join(nl); + if (text.length == (buf.length - 1) * nl.length) + text = ""; + } else if (!this.selection.isEmpty()) { + text = this.session.getTextRange(this.getSelectionRange()); + } + return text; + }; + + this.$checkMultiselectChange = function(e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); + } + }; + this.findAll = function(needle, options, additive) { + options = options || {}; + options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } + this.$search.set(options); + + var ranges = this.$search.findAll(this.session); + if (!ranges.length) + return 0; + + this.$blockScrolling += 1; + var selection = this.multiSelect; + + if (!additive) + selection.toSingleRange(ranges[0]); + + for (var i = ranges.length; i--; ) + selection.addRange(ranges[i], true); + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + + this.$blockScrolling -= 1; + + return ranges.length; + }; + this.selectMoreLines = function(dir, skip) { + var range = this.selection.toOrientedRange(); + var isBackwards = range.cursor == range.end; + + var screenLead = this.session.documentToScreenPosition(range.cursor); + if (this.selection.$desiredColumn) + screenLead.column = this.selection.$desiredColumn; + + var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column); + + if (!range.isEmpty()) { + var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start); + var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column); + } else { + var anchor = lead; + } + + if (isBackwards) { + var newRange = Range.fromPoints(lead, anchor); + newRange.cursor = newRange.start; + } else { + var newRange = Range.fromPoints(anchor, lead); + newRange.cursor = newRange.end; + } + + newRange.desiredColumn = screenLead.column; + if (!this.selection.inMultiSelectMode) { + this.selection.addRange(range); + } else { + if (skip) + var toRemove = range.cursor; + } + + this.selection.addRange(newRange); + if (toRemove) + this.selection.substractPoint(toRemove); + }; + this.transposeSelections = function(dir) { + var session = this.session; + var sel = session.multiSelect; + var all = sel.ranges; + + for (var i = all.length; i--; ) { + var range = all[i]; + if (range.isEmpty()) { + var tmp = session.getWordRange(range.start.row, range.start.column); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + range.end.row = tmp.end.row; + range.end.column = tmp.end.column; + } + } + sel.mergeOverlappingRanges(); + + var words = []; + for (var i = all.length; i--; ) { + var range = all[i]; + words.unshift(session.getTextRange(range)); + } + + if (dir < 0) + words.unshift(words.pop()); + else + words.push(words.shift()); + + for (var i = all.length; i--; ) { + var range = all[i]; + var tmp = range.clone(); + session.replace(range, words[i]); + range.start.row = tmp.start.row; + range.start.column = tmp.start.column; + } + }; + this.selectMore = function(dir, skip, stopAtFirst) { + var session = this.session; + var sel = session.multiSelect; + + var range = sel.toOrientedRange(); + if (range.isEmpty()) { + range = session.getWordRange(range.start.row, range.start.column); + range.cursor = dir == -1 ? range.start : range.end; + this.multiSelect.addRange(range); + if (stopAtFirst) + return; + } + var needle = session.getTextRange(range); + + var newRange = find(session, needle, dir); + if (newRange) { + newRange.cursor = dir == -1 ? newRange.start : newRange.end; + this.$blockScrolling += 1; + this.session.unfold(newRange); + this.multiSelect.addRange(newRange); + this.$blockScrolling -= 1; + this.renderer.scrollCursorIntoView(null, 0.5); + } + if (skip) + this.multiSelect.substractPoint(range.cursor); + }; + this.alignCursors = function() { + var session = this.session; + var sel = session.multiSelect; + var ranges = sel.ranges; + var row = -1; + var sameRowRanges = ranges.filter(function(r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { + var range = this.selection.getRange(); + var fr = range.start.row, lr = range.end.row; + var guessRange = fr == lr; + if (guessRange) { + var max = this.session.getLength(); + var line; + do { + line = this.session.getLine(lr); + } while (/[=:]/.test(line) && ++lr < max); + do { + line = this.session.getLine(fr); + } while (/[=:]/.test(line) && --fr > 0); + + if (fr < 0) fr = 0; + if (lr >= max) lr = max - 1; + } + var lines = this.session.removeFullLines(fr, lr); + lines = this.$reAlignText(lines, guessRange); + this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); + if (!guessRange) { + range.start.column = 0; + range.end.column = lines[lines.length - 1].length; + } + this.selection.setRange(range); + } else { + sameRowRanges.forEach(function(r) { + sel.substractPoint(r.cursor); + }); + + var maxCol = 0; + var minSpace = Infinity; + var spaceOffsets = ranges.map(function(r) { + var p = r.cursor; + var line = session.getLine(p.row); + var spaceOffset = line.substr(p.column).search(/\S/g); + if (spaceOffset == -1) + spaceOffset = 0; + + if (p.column > maxCol) + maxCol = p.column; + if (spaceOffset < minSpace) + minSpace = spaceOffset; + return spaceOffset; + }); + ranges.forEach(function(r, i) { + var p = r.cursor; + var l = maxCol - p.column; + var d = spaceOffsets[i] - minSpace; + if (l > d) + session.insert(p, lang.stringRepeat(" ", l - d)); + else + session.remove(new Range(p.row, p.column, p.row, p.column - l + d)); + + r.start.column = r.end.column = maxCol; + r.start.row = r.end.row = p.row; + r.cursor = r.end; + }); + sel.fromOrientedRange(ranges[0]); + this.renderer.updateCursor(); + this.renderer.updateBackMarkers(); + } + }; + + this.$reAlignText = function(lines, forceLeft) { + var isLeftAligned = true, isRightAligned = true; + var startW, textW, endW; + + return lines.map(function(line) { + var m = line.match(/(\s*)(.*?)(\s*)([=:].*)/); + if (!m) + return [line]; + + if (startW == null) { + startW = m[1].length; + textW = m[2].length; + endW = m[3].length; + return m; + } + + if (startW + textW + endW != m[1].length + m[2].length + m[3].length) + isRightAligned = false; + if (startW != m[1].length) + isLeftAligned = false; + + if (startW > m[1].length) + startW = m[1].length; + if (textW < m[2].length) + textW = m[2].length; + if (endW > m[3].length) + endW = m[3].length; + + return m; + }).map(forceLeft ? alignLeft : + isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); + + function spaces(n) { + return lang.stringRepeat(" ", n); + } + + function alignLeft(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function alignRight(m) { + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW, " ") + + m[4].replace(/^([=:])\s+/, "$1 "); + } + function unAlign(m) { + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + + m[4].replace(/^([=:])\s+/, "$1 "); + } + }; +}).call(Editor.prototype); + + +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} +exports.onSessionChange = function(e) { + var session = e.session; + if (session && !session.multiSelect) { + session.$selectionMarkers = []; + session.selection.$initRangeList(); + session.multiSelect = session.selection; + } + this.multiSelect = session && session.multiSelect; + + var oldSession = e.oldSession; + if (oldSession) { + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); + } + + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } + + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session.selection.inMultiSelectMode) + this.$onMultiSelect(); + else + this.$onSingleSelect(); + } +}; +function MultiSelect(editor) { + if (editor.$multiselectOnSessionChange) + return; + editor.$onAddRange = editor.$onAddRange.bind(editor); + editor.$onRemoveRange = editor.$onRemoveRange.bind(editor); + editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); + editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); + editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); + + editor.$multiselectOnSessionChange(editor); + editor.on("changeSession", editor.$multiselectOnSessionChange); + + editor.on("mousedown", onMouseDown); + editor.commands.addCommands(commands.defaultCommands); + + addAltCursorListeners(editor); +} + +function addAltCursorListeners(editor){ + var el = editor.textInput.getElement(); + var altCursor = false; + event.addListener(el, "keydown", function(e) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { + if (!altCursor) { + editor.renderer.setMouseCursor("crosshair"); + altCursor = true; + } + } else if (altCursor) { + reset(); + } + }); + + event.addListener(el, "keyup", reset); + event.addListener(el, "blur", reset); + function reset(e) { + if (altCursor) { + editor.renderer.setMouseCursor(""); + altCursor = false; + } + } +} + +exports.MultiSelect = MultiSelect; + + +require("./config").defineOptions(Editor.prototype, "editor", { + enableMultiselect: { + set: function(val) { + MultiSelect(this); + if (val) { + this.on("changeSession", this.$multiselectOnSessionChange); + this.on("mousedown", onMouseDown); + } else { + this.off("changeSession", this.$multiselectOnSessionChange); + this.off("mousedown", onMouseDown); + } + }, + value: true + }, + enableBlockSelect: { + set: function(val) { + this.$blockSelectEnabled = val; + }, + value: true + } +}); + + + +}); + +ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../../range").Range; + +var FoldMode = exports.FoldMode = function() {}; + +(function() { + + this.foldingStartMarker = null; + this.foldingStopMarker = null; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + if (this.foldingStartMarker.test(line)) + return "start"; + if (foldStyle == "markbeginend" + && this.foldingStopMarker + && this.foldingStopMarker.test(line)) + return "end"; + return ""; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row) { + return null; + }; + + this.indentationBlock = function(session, row, column) { + var re = /\S/; + var line = session.getLine(row); + var startLevel = line.search(re); + if (startLevel == -1) + return; + + var startColumn = column || line.length; + var maxRow = session.getLength(); + var startRow = row; + var endRow = row; + + while (++row < maxRow) { + var level = session.getLine(row).search(re); + + if (level == -1) + continue; + + if (level <= startLevel) + break; + + endRow = row; + } + + if (endRow > startRow) { + var endColumn = session.getLine(endRow).length; + return new Range(startRow, startColumn, endRow, endColumn); + } + }; + + this.openingBracketBlock = function(session, bracket, row, column, typeRe) { + var start = {row: row, column: column + 1}; + var end = session.$findClosingBracket(bracket, start, typeRe); + if (!end) + return; + + var fw = session.foldWidgets[end.row]; + if (fw == null) + fw = session.getFoldWidget(end.row); + + if (fw == "start" && end.row > start.row) { + end.row --; + end.column = session.getLine(end.row).length; + } + return Range.fromPoints(start, end); + }; + + this.closingBracketBlock = function(session, bracket, row, column, typeRe) { + var end = {row: row, column: column}; + var start = session.$findOpeningBracket(bracket, end); + + if (!start) + return; + + start.column++; + end.column--; + + return Range.fromPoints(start, end); + }; +}).call(FoldMode.prototype); + +}); + +ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; + +exports.isDark = false; +exports.cssClass = "ace-tm"; +exports.cssText = ".ace-tm .ace_gutter {\ +background: #f0f0f0;\ +color: #333;\ +}\ +.ace-tm .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-tm .ace_fold {\ +background-color: #6B72E6;\ +}\ +.ace-tm {\ +background-color: #FFFFFF;\ +color: black;\ +}\ +.ace-tm .ace_cursor {\ +color: black;\ +}\ +.ace-tm .ace_invisible {\ +color: rgb(191, 191, 191);\ +}\ +.ace-tm .ace_storage,\ +.ace-tm .ace_keyword {\ +color: blue;\ +}\ +.ace-tm .ace_constant {\ +color: rgb(197, 6, 11);\ +}\ +.ace-tm .ace_constant.ace_buildin {\ +color: rgb(88, 72, 246);\ +}\ +.ace-tm .ace_constant.ace_language {\ +color: rgb(88, 92, 246);\ +}\ +.ace-tm .ace_constant.ace_library {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_invalid {\ +background-color: rgba(255, 0, 0, 0.1);\ +color: red;\ +}\ +.ace-tm .ace_support.ace_function {\ +color: rgb(60, 76, 114);\ +}\ +.ace-tm .ace_support.ace_constant {\ +color: rgb(6, 150, 14);\ +}\ +.ace-tm .ace_support.ace_type,\ +.ace-tm .ace_support.ace_class {\ +color: rgb(109, 121, 222);\ +}\ +.ace-tm .ace_keyword.ace_operator {\ +color: rgb(104, 118, 135);\ +}\ +.ace-tm .ace_string {\ +color: rgb(3, 106, 7);\ +}\ +.ace-tm .ace_comment {\ +color: rgb(76, 136, 107);\ +}\ +.ace-tm .ace_comment.ace_doc {\ +color: rgb(0, 102, 255);\ +}\ +.ace-tm .ace_comment.ace_doc.ace_tag {\ +color: rgb(128, 159, 191);\ +}\ +.ace-tm .ace_constant.ace_numeric {\ +color: rgb(0, 0, 205);\ +}\ +.ace-tm .ace_variable {\ +color: rgb(49, 132, 149);\ +}\ +.ace-tm .ace_xml-pe {\ +color: rgb(104, 104, 91);\ +}\ +.ace-tm .ace_entity.ace_name.ace_function {\ +color: #0000A2;\ +}\ +.ace-tm .ace_heading {\ +color: rgb(12, 7, 255);\ +}\ +.ace-tm .ace_list {\ +color:rgb(185, 6, 144);\ +}\ +.ace-tm .ace_meta.ace_tag {\ +color:rgb(0, 22, 142);\ +}\ +.ace-tm .ace_string.ace_regex {\ +color: rgb(255, 0, 0)\ +}\ +.ace-tm .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-tm.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-tm .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-tm .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-tm .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-tm .ace_marker-layer .ace_active-line {\ +background: rgba(0, 0, 0, 0.07);\ +}\ +.ace-tm .ace_gutter-active-line {\ +background-color : #dcdcdc;\ +}\ +.ace-tm .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-tm .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}\ +"; + +var dom = require("../lib/dom"); +dom.importCssString(exports.cssText, exports.cssClass); +}); + +ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var Range = require("./range").Range; + + +function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); +} + +(function() { + this.getRowLength = function(row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + + this.$getWidgetScreenLength = function() { + var screenRows = 0; + this.lineWidgets.forEach(function(w){ + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; + }; + + this.$onChangeEditor = function(e) { + this.attach(e.editor); + }; + + this.attach = function(editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + + if (this.editor == editor) + return; + + this.detach(); + this.editor = editor; + + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + this.detach = function(e) { + var editor = this.editor; + if (!editor) + return; + + this.editor = null; + editor.widgetManager = null; + + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function(w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); + }; + + this.updateOnFold = function(e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; + } + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } + } + }; + + this.updateOnChange = function(delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + } else if (delta.action == 'remove') { + var removed = lineWidgets.splice(startRow + 1, len); + removed.forEach(function(w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } else { + var args = new Array(len); + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + + this.$updateRows = function() { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + var noWidgets = true; + lineWidgets.forEach(function(w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } + }); + if (noWidgets) + this.session.lineWidgets = null; + }; + + this.addLineWidget = function(w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } + } + + this.session.lineWidgets[w.row] = w; + + w.session = this.session; + + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; + } + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + w.el.style.position = "absolute"; + w.el.style.zIndex = 5; + renderer.container.appendChild(w.el); + w._inDocument = true; + } + + if (!w.coverGutter) { + w.el.style.zIndex = 3; + } + if (!w.pixelHeight) { + w.pixelHeight = w.el.offsetHeight; + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; + }; + + this.removeLineWidget = function(w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) try { + w.editor.destroy(); + } catch(e){} + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row] + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + this.$updateRows(); + }; + + this.getWidgetsAtRow = function(row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + + this.onWidgetChanged = function(w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + + this.measureWidgets = function(e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + + if (!changedWidgets || !changedWidgets.length) return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) continue; + if (w.session != this.session) continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + + w.h = w.el.offsetHeight; + + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", {data:{start:{row: min}}}); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + + this.renderWidgets = function(e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + + while (first > 0 && !lineWidgets[first]) + first--; + + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } else { + w.el.style.right = ""; + } + } + }; + +}).call(LineWidgets.prototype); + + +exports.LineWidgets = LineWidgets; + +}); + +ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var dom = require("../lib/dom"); +var Range = require("../range").Range; + +function binarySearch(array, needle, comparator) { + var first = 0; + var last = array.length - 1; + + while (first <= last) { + var mid = (first + last) >> 1; + var c = comparator(needle, array[mid]); + if (c > 0) + first = mid + 1; + else if (c < 0) + last = mid - 1; + else + return mid; + } + return -(first + 1); +} + +function findAnnotations(session, row, dir) { + var annotations = session.getAnnotations().sort(Range.comparePoints); + if (!annotations.length) + return; + + var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints); + if (i < 0) + i = -i - 1; + + if (i >= annotations.length) + i = dir > 0 ? 0 : annotations.length - 1; + else if (i === 0 && dir < 0) + i = annotations.length - 1; + + var annotation = annotations[i]; + if (!annotation || !dir) + return; + + if (annotation.row === row) { + do { + annotation = annotations[i += dir]; + } while (annotation && annotation.row === row); + if (!annotation) + return annotations.slice(); + } + + + var matched = []; + row = annotation.row; + do { + matched[dir < 0 ? "unshift" : "push"](annotation); + annotation = annotations[i += dir]; + } while (annotation && annotation.row == row); + return matched.length && matched; +} + +exports.showErrorMarker = function(editor, dir) { + var session = editor.session; + if (!session.widgetManager) { + session.widgetManager = new LineWidgets(session); + session.widgetManager.attach(editor); + } + + var pos = editor.getCursorPosition(); + var row = pos.row; + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + return w.type == "errorMarker"; + })[0]; + if (oldWidget) { + oldWidget.destroy(); + } else { + row -= dir; + } + var annotations = findAnnotations(session, row, dir); + var gutterAnno; + if (annotations) { + var annotation = annotations[0]; + pos.column = (annotation.pos && typeof annotation.column != "number" + ? annotation.pos.sc + : annotation.column) || 0; + pos.row = annotation.row; + gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row]; + } else if (oldWidget) { + return; + } else { + gutterAnno = { + text: ["Looks good!"], + className: "ace_ok" + }; + } + editor.session.unfold(pos.row); + editor.selection.moveToPosition(pos); + + var w = { + row: pos.row, + fixedWidth: true, + coverGutter: true, + el: dom.createElement("div"), + type: "errorMarker" + }; + var el = w.el.appendChild(dom.createElement("div")); + var arrow = w.el.appendChild(dom.createElement("div")); + arrow.className = "error_widget_arrow " + gutterAnno.className; + + var left = editor.renderer.$cursorLayer + .getPixelPosition(pos).left; + arrow.style.left = left + editor.renderer.gutterWidth - 5 + "px"; + + w.el.className = "error_widget_wrapper"; + el.className = "error_widget " + gutterAnno.className; + el.innerHTML = gutterAnno.text.join("
      "); + + el.appendChild(dom.createElement("div")); + + var kb = function(_, hashId, keyString) { + if (hashId === 0 && (keyString === "esc" || keyString === "return")) { + w.destroy(); + return {command: "null"}; + } + }; + + w.destroy = function() { + if (editor.$mouseHandler.isMousePressed) + return; + editor.keyBinding.removeKeyboardHandler(kb); + session.widgetManager.removeLineWidget(w); + editor.off("changeSelection", w.destroy); + editor.off("changeSession", w.destroy); + editor.off("mouseup", w.destroy); + editor.off("change", w.destroy); + }; + + editor.keyBinding.addKeyboardHandler(kb); + editor.on("changeSelection", w.destroy); + editor.on("changeSession", w.destroy); + editor.on("mouseup", w.destroy); + editor.on("change", w.destroy); + + editor.session.widgetManager.addLineWidget(w); + + w.el.onmousedown = editor.focus.bind(editor); + + editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight}); +}; + + +dom.importCssString("\ + .error_widget_wrapper {\ + background: inherit;\ + color: inherit;\ + border:none\ + }\ + .error_widget {\ + border-top: solid 2px;\ + border-bottom: solid 2px;\ + margin: 5px 0;\ + padding: 10px 40px;\ + white-space: pre-wrap;\ + }\ + .error_widget.ace_error, .error_widget_arrow.ace_error{\ + border-color: #ff5a5a\ + }\ + .error_widget.ace_warning, .error_widget_arrow.ace_warning{\ + border-color: #F1D817\ + }\ + .error_widget.ace_info, .error_widget_arrow.ace_info{\ + border-color: #5a5a5a\ + }\ + .error_widget.ace_ok, .error_widget_arrow.ace_ok{\ + border-color: #5aaa5a\ + }\ + .error_widget_arrow {\ + position: absolute;\ + border: solid 5px;\ + border-top-color: transparent!important;\ + border-right-color: transparent!important;\ + border-left-color: transparent!important;\ + top: -5px;\ + }\ +", ""); + +}); + +ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var dom = require("./lib/dom"); +var event = require("./lib/event"); + +var Editor = require("./editor").Editor; +var EditSession = require("./edit_session").EditSession; +var UndoManager = require("./undomanager").UndoManager; +var Renderer = require("./virtual_renderer").VirtualRenderer; +require("./worker/worker_client"); +require("./keyboard/hash_handler"); +require("./placeholder"); +require("./multi_select"); +require("./mode/folding/fold_mode"); +require("./theme/textmate"); +require("./ext/error_marker"); + +exports.config = require("./config"); +exports.require = require; +exports.edit = function(el) { + if (typeof el == "string") { + var _id = el; + el = document.getElementById(_id); + if (!el) + throw new Error("ace.edit can't find div #" + _id); + } + + if (el && el.env && el.env.editor instanceof Editor) + return el.env.editor; + + var value = ""; + if (el && /input|textarea/i.test(el.tagName)) { + var oldNode = el; + value = oldNode.value; + el = dom.createElement("pre"); + oldNode.parentNode.replaceChild(el, oldNode); + } else if (el) { + value = dom.getInnerText(el); + el.innerHTML = ""; + } + + var doc = exports.createEditSession(value); + + var editor = new Editor(new Renderer(el)); + editor.setSession(doc); + + var env = { + document: doc, + editor: editor, + onResize: editor.resize.bind(editor, null) + }; + if (oldNode) env.textarea = oldNode; + event.addListener(window, "resize", env.onResize); + editor.on("destroy", function() { + event.removeListener(window, "resize", env.onResize); + env.editor.container.env = null; // prevent memory leak on old ie + }); + editor.container.env = editor.env = env; + return editor; +}; +exports.createEditSession = function(text, mode) { + var doc = new EditSession(text, mode); + doc.setUndoManager(new UndoManager()); + return doc; +} +exports.EditSession = EditSession; +exports.UndoManager = UndoManager; +exports.version = "1.2.3"; +}); + (function() { + ace.require(["ace/ace"], function(a) { + a && a.config.init(true); + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/common/resources/lib/ui-ace/min/ace.js b/common/resources/lib/ui-ace/min/ace.js new file mode 100644 index 0000000..faa3034 --- /dev/null +++ b/common/resources/lib/ui-ace/min/ace.js @@ -0,0 +1,11 @@ +(function(){function o(n){var i=e;n&&(e[n]||(e[n]={}),i=e[n]);if(!i.define||!i.define.packaged)t.original=i.define,i.define=t,i.define.packaged=!0;if(!i.require||!i.require.packaged)r.original=i.require,i.require=r,i.require.packaged=!0}var ACE_NAMESPACE = "ace",e=function(){return this}();!e&&typeof window!="undefined"&&(e=window);if(!ACE_NAMESPACE&&typeof requirejs!="undefined")return;var t=function(e,n,r){if(typeof e!="string"){t.original?t.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace());return}arguments.length==2&&(r=n),t.modules[e]||(t.payloads[e]=r,t.modules[e]=null)};t.modules={},t.payloads={};var n=function(e,t,n){if(typeof t=="string"){var i=s(e,t);if(i!=undefined)return n&&n(),i}else if(Object.prototype.toString.call(t)==="[object Array]"){var o=[];for(var u=0,a=t.length;u1&&u(t,"")>-1&&(a=RegExp(this.source,r.replace.call(o(this),"g","")),r.replace.call(e.slice(t.index),a,function(){for(var e=1;et.index&&this.lastIndex--}return t},s||(RegExp.prototype.test=function(e){var t=r.exec.call(this,e);return t&&this.global&&!t[0].length&&this.lastIndex>t.index&&this.lastIndex--,!!t})}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(e,t,n){function r(){}function w(e){try{return Object.defineProperty(e,"sentinel",{}),"sentinel"in e}catch(t){}}function H(e){return e=+e,e!==e?e=0:e!==0&&e!==1/0&&e!==-1/0&&(e=(e>0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n=0?parseFloat((i.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((i.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),t.isOldIE=t.isIE&&t.isIE<9,t.isGecko=t.isMozilla=(window.Controllers||window.controllers)&&window.navigator.product==="Gecko",t.isOldGecko=t.isGecko&&parseInt((i.match(/rv\:(\d+)/)||[])[1],10)<4,t.isOpera=window.opera&&Object.prototype.toString.call(window.opera)=="[object Opera]",t.isWebKit=parseFloat(i.split("WebKit/")[1])||undefined,t.isChrome=parseFloat(i.split(" Chrome/")[1])||undefined,t.isAIR=i.indexOf("AdobeAIR")>=0,t.isIPad=i.indexOf("iPad")>=0,t.isTouchPad=i.indexOf("TouchPad")>=0,t.isChromeOS=i.indexOf(" CrOS ")>=0}),ace.define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function a(e,t,n){var a=u(t);if(!i.isMac&&s){s.OSKey&&(a|=8);if(s.altGr){if((3&a)==3)return;s.altGr=0}if(n===18||n===17){var f="location"in t?t.location:t.keyLocation;if(n===17&&f===1)s[n]==1&&(o=t.timeStamp);else if(n===18&&a===3&&f===2){var l=t.timeStamp-o;l<50&&(s.altGr=!0)}}}n in r.MODIFIER_KEYS&&(n=-1),a&8&&n>=91&&n<=93&&(n=-1);if(!a&&n===13){var f="location"in t?t.location:t.keyLocation;if(f===3){e(t,a,-n);if(t.defaultPrevented)return}}if(i.isChromeOS&&a&8){e(t,a,n);if(t.defaultPrevented)return;a&=-9}return!!a||n in r.FUNCTION_KEYS||n in r.PRINTABLE_KEYS?e(t,a,n):!1}function f(){s=Object.create(null),s.count=0,s.lastT=0}var r=e("./keys"),i=e("./useragent"),s=null,o=0;t.addListener=function(e,t,n){if(e.addEventListener)return e.addEventListener(t,n,!1);if(e.attachEvent){var r=function(){n.call(e,window.event)};n._wrapper=r,e.attachEvent("on"+t,r)}},t.removeListener=function(e,t,n){if(e.removeEventListener)return e.removeEventListener(t,n,!1);e.detachEvent&&e.detachEvent("on"+t,n._wrapper||n)},t.stopEvent=function(e){return t.stopPropagation(e),t.preventDefault(e),!1},t.stopPropagation=function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},t.preventDefault=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},t.getButton=function(e){return e.type=="dblclick"?0:e.type=="contextmenu"||i.isMac&&e.ctrlKey&&!e.altKey&&!e.shiftKey?2:e.preventDefault?e.button:{1:0,2:2,4:1}[e.button]},t.capture=function(e,n,r){function i(e){n&&n(e),r&&r(e),t.removeListener(document,"mousemove",n,!0),t.removeListener(document,"mouseup",i,!0),t.removeListener(document,"dragstart",i,!0)}return t.addListener(document,"mousemove",n,!0),t.addListener(document,"mouseup",i,!0),t.addListener(document,"dragstart",i,!0),i},t.addTouchMoveListener=function(e,n){if("ontouchmove"in e){var r,i;t.addListener(e,"touchstart",function(e){var t=e.changedTouches[0];r=t.clientX,i=t.clientY}),t.addListener(e,"touchmove",function(e){var t=1,s=e.changedTouches[0];e.wheelX=-(s.clientX-r)/t,e.wheelY=-(s.clientY-i)/t,r=s.clientX,i=s.clientY,n(e)})}},t.addMouseWheelListener=function(e,n){"onmousewheel"in e?t.addListener(e,"mousewheel",function(e){var t=8;e.wheelDeltaX!==undefined?(e.wheelX=-e.wheelDeltaX/t,e.wheelY=-e.wheelDeltaY/t):(e.wheelX=0,e.wheelY=-e.wheelDelta/t),n(e)}):"onwheel"in e?t.addListener(e,"wheel",function(e){var t=.35;switch(e.deltaMode){case e.DOM_DELTA_PIXEL:e.wheelX=e.deltaX*t||0,e.wheelY=e.deltaY*t||0;break;case e.DOM_DELTA_LINE:case e.DOM_DELTA_PAGE:e.wheelX=(e.deltaX||0)*5,e.wheelY=(e.deltaY||0)*5}n(e)}):t.addListener(e,"DOMMouseScroll",function(e){e.axis&&e.axis==e.HORIZONTAL_AXIS?(e.wheelX=(e.detail||0)*5,e.wheelY=0):(e.wheelX=0,e.wheelY=(e.detail||0)*5),n(e)})},t.addMultiMouseDownListener=function(e,n,r,s){function c(e){t.getButton(e)!==0?o=0:e.detail>1?(o++,o>4&&(o=1)):o=1;if(i.isIE){var c=Math.abs(e.clientX-u)>5||Math.abs(e.clientY-a)>5;if(!f||c)o=1;f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),o==1&&(u=e.clientX,a=e.clientY)}e._clicks=o,r[s]("mousedown",e);if(o>4)o=0;else if(o>1)return r[s](l[o],e)}function h(e){o=2,f&&clearTimeout(f),f=setTimeout(function(){f=null},n[o-1]||600),r[s]("mousedown",e),r[s](l[o],e)}var o=0,u,a,f,l={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(e)||(e=[e]),e.forEach(function(e){t.addListener(e,"mousedown",c),i.isOldIE&&t.addListener(e,"dblclick",h)})};var u=!i.isMac||!i.isOpera||"KeyboardEvent"in window?function(e){return 0|(e.ctrlKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.metaKey?8:0)}:function(e){return 0|(e.metaKey?1:0)|(e.altKey?2:0)|(e.shiftKey?4:0)|(e.ctrlKey?8:0)};t.getModifierString=function(e){return r.KEY_MODS[u(e)]},t.addCommandKeyListener=function(e,n){var r=t.addListener;if(i.isOldGecko||i.isOpera&&!("KeyboardEvent"in window)){var o=null;r(e,"keydown",function(e){o=e.keyCode}),r(e,"keypress",function(e){return a(n,e,o)})}else{var u=null;r(e,"keydown",function(e){var t=e.keyCode;s[t]=(s[t]||0)+1,t==91||t==92?s.OSKey=!0:s.OSKey&&e.timeStamp-s.lastT>200&&s.count==1&&f(),s[t]==1&&s.count++,s.lastT=e.timeStamp;var r=a(n,e,t);return u=e.defaultPrevented,r}),r(e,"keypress",function(e){u&&(e.ctrlKey||e.altKey||e.shiftKey||e.metaKey)&&(t.stopEvent(e),u=null)}),r(e,"keyup",function(e){var t=e.keyCode;s[t]?s.count=Math.max(s.count-1,0):f();if(t==91||t==92)s.OSKey=!1;s[t]=null}),s||(f(),r(window,"focus",f))}};if(typeof window=="object"&&window.postMessage&&!i.isOldIE){var l=1;t.nextTick=function(e,n){n=n||window;var r="zero-timeout-message-"+l;t.addListener(n,"message",function i(s){s.data==r&&(t.stopPropagation(s),t.removeListener(n,"message",i),e())}),n.postMessage(r,"*")}}t.nextFrame=typeof window=="object"&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),t.nextFrame?t.nextFrame=t.nextFrame.bind(window):t.nextFrame=function(e){setTimeout(e,17)}}),ace.define("ace/lib/lang",["require","exports","module"],function(e,t,n){"use strict";t.last=function(e){return e[e.length-1]},t.stringReverse=function(e){return e.split("").reverse().join("")},t.stringRepeat=function(e,t){var n="";while(t>0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n1),e.preventDefault()},this.startSelect=function(e,t){e=e||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var n=this.editor;n.$blockScrolling++,this.mousedownEvent.getShiftKey()?n.selection.selectToPosition(e):t||n.selection.moveToPosition(e),t||this.select(),n.renderer.scroller.setCapture&&n.renderer.scroller.setCapture(),n.setStyle("ace_selecting"),this.setState("select"),n.$blockScrolling--},this.select=function(){var e,t=this.editor,n=t.renderer.screenToTextCoordinates(this.x,this.y);t.$blockScrolling++;if(this.$clickSelection){var r=this.$clickSelection.comparePoint(n);if(r==-1)e=this.$clickSelection.end;else if(r==1)e=this.$clickSelection.start;else{var i=f(this.$clickSelection,n);n=i.cursor,e=i.anchor}t.selection.setSelectionAnchor(e.row,e.column)}t.selection.selectToPosition(n),t.$blockScrolling--,t.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(e){var t,n=this.editor,r=n.renderer.screenToTextCoordinates(this.x,this.y),i=n.selection[e](r.row,r.column);n.$blockScrolling++;if(this.$clickSelection){var s=this.$clickSelection.comparePoint(i.start),o=this.$clickSelection.comparePoint(i.end);if(s==-1&&o<=0){t=this.$clickSelection.end;if(i.end.row!=r.row||i.end.column!=r.column)r=i.start}else if(o==1&&s>=0){t=this.$clickSelection.start;if(i.start.row!=r.row||i.start.column!=r.column)r=i.end}else if(s==-1&&o==1)r=i.end,t=i.start;else{var u=f(this.$clickSelection,r);r=u.cursor,t=u.anchor}n.selection.setSelectionAnchor(t.row,t.column)}n.selection.selectToPosition(r),n.$blockScrolling--,n.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var e=a(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),t=Date.now();(e>o||t-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(e){var t=e.getDocumentPosition(),n=this.editor,r=n.session,i=r.getBracketRange(t);i?(i.isEmpty()&&(i.start.column--,i.end.column++),this.setState("select")):(i=n.selection.getWordRange(t.row,t.column),this.setState("selectByWords")),this.$clickSelection=i,this.select()},this.onTripleClick=function(e){var t=e.getDocumentPosition(),n=this.editor;this.setState("selectByLines");var r=n.getSelectionRange();r.isMultiLine()&&r.contains(t.row,t.column)?(this.$clickSelection=n.selection.getLineRange(r.start.row),this.$clickSelection.end=n.selection.getLineRange(r.end.row).end):this.$clickSelection=n.selection.getLineRange(t.row),this.select()},this.onQuadClick=function(e){var t=this.editor;t.selectAll(),this.$clickSelection=t.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(e){if(e.getAccelKey())return;e.getShiftKey()&&e.wheelY&&!e.wheelX&&(e.wheelX=e.wheelY,e.wheelY=0);var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()},this.onTouchMove=function(e){var t=e.domEvent.timeStamp,n=t-(this.$lastScrollTime||0),r=this.editor,i=r.renderer.isScrollableBy(e.wheelX*e.speed,e.wheelY*e.speed);if(i||n<200)return this.$lastScrollTime=t,r.renderer.scrollBy(e.wheelX*e.speed,e.wheelY*e.speed),e.stop()}}).call(u.prototype),t.DefaultHandlers=u}),ace.define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(e,t,n){"use strict";function s(e){this.isOpen=!1,this.$element=null,this.$parentNode=e}var r=e("./lib/oop"),i=e("./lib/dom");(function(){this.$init=function(){return this.$element=i.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(e){i.setInnerText(this.getElement(),e)},this.setHtml=function(e){this.getElement().innerHTML=e},this.setPosition=function(e,t){this.getElement().style.left=e+"px",this.getElement().style.top=t+"px"},this.setClassName=function(e){i.addCssClass(this.getElement(),e)},this.show=function(e,t,n){e!=null&&this.setText(e),t!=null&&n!=null&&this.setPosition(t,n),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(s.prototype),t.Tooltip=s}),ace.define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(e,t,n){"use strict";function u(e){function l(){var r=u.getDocumentPosition().row,s=n.$annotations[r];if(!s)return c();var o=t.session.getLength();if(r==o){var a=t.renderer.pixelToScreenCoordinates(0,u.y).row,l=u.$pos;if(a>t.session.documentToScreenRow(l.row,l.column))return c()}if(f==s)return;f=s.text.join("
      "),i.setHtml(f),i.show(),t.on("mousewheel",c);if(e.$tooltipFollowsMouse)h(u);else{var p=u.domEvent.target,d=p.getBoundingClientRect(),v=i.getElement().style;v.left=d.right+"px",v.top=d.bottom+"px"}}function c(){o&&(o=clearTimeout(o)),f&&(i.hide(),f=null,t.removeEventListener("mousewheel",c))}function h(e){i.setPosition(e.x,e.y)}var t=e.editor,n=t.renderer.$gutterLayer,i=new a(t.container);e.editor.setDefaultHandler("guttermousedown",function(r){if(!t.isFocused()||r.getButton()!=0)return;var i=n.getRegion(r);if(i=="foldWidgets")return;var s=r.getDocumentPosition().row,o=t.session.selection;if(r.getShiftKey())o.selectTo(s,0);else{if(r.domEvent.detail==2)return t.selectAll(),r.preventDefault();e.$clickSelection=t.selection.getLineRange(s)}return e.setState("selectByLines"),e.captureMouse(r),r.preventDefault()});var o,u,f;e.editor.setDefaultHandler("guttermousemove",function(t){var n=t.domEvent.target||t.domEvent.srcElement;if(r.hasCssClass(n,"ace_fold-widget"))return c();f&&e.$tooltipFollowsMouse&&h(t),u=t;if(o)return;o=setTimeout(function(){o=null,u&&!e.isMousePressed?l():c()},50)}),s.addListener(t.renderer.$gutter,"mouseout",function(e){u=null;if(!f||o)return;o=setTimeout(function(){o=null,c()},50)}),t.on("changeSession",c)}function a(e){o.call(this,e)}var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/event"),o=e("../tooltip").Tooltip;i.inherits(a,o),function(){this.setPosition=function(e,t){var n=window.innerWidth||document.documentElement.clientWidth,r=window.innerHeight||document.documentElement.clientHeight,i=this.getWidth(),s=this.getHeight();e+=15,t+=15,e+i>n&&(e-=e+i-n),t+s>r&&(t-=20+s),o.prototype.setPosition.call(this,e,t)}}.call(a.prototype),t.GutterHandler=u}),ace.define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=t.MouseEvent=function(e,t){this.domEvent=e,this.editor=t,this.x=this.clientX=e.clientX,this.y=this.clientY=e.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){r.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){r.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(this.$inSelection!==null)return this.$inSelection;var e=this.editor,t=e.getSelectionRange();if(t.isEmpty())this.$inSelection=!1;else{var n=this.getDocumentPosition();this.$inSelection=t.contains(n.row,n.column)}return this.$inSelection},this.getButton=function(){return r.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=i.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(s.prototype)}),ace.define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(e,t,n){"use strict";function f(e){function T(e,n){var r=Date.now(),i=!n||e.row!=n.row,s=!n||e.column!=n.column;if(!S||i||s)t.$blockScrolling+=1,t.moveCursorToPosition(e),t.$blockScrolling-=1,S=r,x={x:p,y:d};else{var o=l(x.x,x.y,p,d);o>a?S=null:r-S>=u&&(t.renderer.scrollCursorIntoView(),S=null)}}function N(e,n){var r=Date.now(),i=t.renderer.layerConfig.lineHeight,s=t.renderer.layerConfig.characterWidth,u=t.renderer.scroller.getBoundingClientRect(),a={x:{left:p-u.left,right:u.right-p},y:{top:d-u.top,bottom:u.bottom-d}},f=Math.min(a.x.left,a.x.right),l=Math.min(a.y.top,a.y.bottom),c={row:e.row,column:e.column};f/s<=2&&(c.column+=a.x.left=o&&t.renderer.scrollCursorIntoView(c):E=r:E=null}function C(){var e=g;g=t.renderer.screenToTextCoordinates(p,d),T(g,e),N(g,e)}function k(){m=t.selection.toOrientedRange(),h=t.session.addMarker(m,"ace_selection",t.getSelectionStyle()),t.clearSelection(),t.isFocused()&&t.renderer.$cursorLayer.setBlinking(!1),clearInterval(v),C(),v=setInterval(C,20),y=0,i.addListener(document,"mousemove",O)}function L(){clearInterval(v),t.session.removeMarker(h),h=null,t.$blockScrolling+=1,t.selection.fromOrientedRange(m),t.$blockScrolling-=1,t.isFocused()&&!w&&t.renderer.$cursorLayer.setBlinking(!t.getReadOnly()),m=null,g=null,y=0,E=null,S=null,i.removeListener(document,"mousemove",O)}function O(){A==null&&(A=setTimeout(function(){A!=null&&h&&L()},20))}function M(e){var t=e.types;return!t||Array.prototype.some.call(t,function(e){return e=="text/plain"||e=="Text"})}function _(e){var t=["copy","copymove","all","uninitialized"],n=["move","copymove","linkmove","all","uninitialized"],r=s.isMac?e.altKey:e.ctrlKey,i="uninitialized";try{i=e.dataTransfer.effectAllowed.toLowerCase()}catch(e){}var o="none";return r&&t.indexOf(i)>=0?o="copy":n.indexOf(i)>=0?o="move":t.indexOf(i)>=0&&(o="copy"),o}var t=e.editor,n=r.createElement("img");n.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",s.isOpera&&(n.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var f=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];f.forEach(function(t){e[t]=this[t]},this),t.addEventListener("mousedown",this.onMouseDown.bind(e));var c=t.container,h,p,d,v,m,g,y=0,b,w,E,S,x;this.onDragStart=function(e){if(this.cancelDrag||!c.draggable){var r=this;return setTimeout(function(){r.startSelect(),r.captureMouse(e)},0),e.preventDefault()}m=t.getSelectionRange();var i=e.dataTransfer;i.effectAllowed=t.getReadOnly()?"copy":"copyMove",s.isOpera&&(t.container.appendChild(n),n.scrollTop=0),i.setDragImage&&i.setDragImage(n,0,0),s.isOpera&&t.container.removeChild(n),i.clearData(),i.setData("Text",t.session.getTextRange()),w=!0,this.setState("drag")},this.onDragEnd=function(e){c.draggable=!1,w=!1,this.setState(null);if(!t.getReadOnly()){var n=e.dataTransfer.dropEffect;!b&&n=="move"&&t.session.remove(t.getSelectionRange()),t.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||k(),y++,e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragOver=function(e){if(t.getReadOnly()||!M(e.dataTransfer))return;return p=e.clientX,d=e.clientY,h||(k(),y++),A!==null&&(A=null),e.dataTransfer.dropEffect=b=_(e),i.preventDefault(e)},this.onDragLeave=function(e){y--;if(y<=0&&h)return L(),b=null,i.preventDefault(e)},this.onDrop=function(e){if(!g)return;var n=e.dataTransfer;if(w)switch(b){case"move":m.contains(g.row,g.column)?m={start:g,end:g}:m=t.moveText(m,g);break;case"copy":m=t.moveText(m,g,!0)}else{var r=n.getData("Text");m={start:g,end:t.session.insert(g,r)},t.focus(),b=null}return L(),i.preventDefault(e)},i.addListener(c,"dragstart",this.onDragStart.bind(e)),i.addListener(c,"dragend",this.onDragEnd.bind(e)),i.addListener(c,"dragenter",this.onDragEnter.bind(e)),i.addListener(c,"dragover",this.onDragOver.bind(e)),i.addListener(c,"dragleave",this.onDragLeave.bind(e)),i.addListener(c,"drop",this.onDrop.bind(e));var A=null}function l(e,t,n,r){return Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2))}var r=e("../lib/dom"),i=e("../lib/event"),s=e("../lib/useragent"),o=200,u=200,a=5;(function(){this.dragWait=function(){var e=Date.now()-this.mousedownEvent.time;e>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var e=this.editor.container;e.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(e){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var e=this.editor,t=e.container;t.draggable=!0,e.renderer.$cursorLayer.setBlinking(!1),e.setStyle("ace_dragging");var n=s.isWin?"default":"move";e.renderer.setCursorStyle(n),this.setState("dragReady")},this.onMouseDrag=function(e){var t=this.editor.container;if(s.isIE&&this.state=="dragReady"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>3&&t.dragDrop()}if(this.state==="dragWait"){var n=l(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);n>0&&(t.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(e){if(!this.$dragEnabled)return;this.mousedownEvent=e;var t=this.editor,n=e.inSelection(),r=e.getButton(),i=e.domEvent.detail||1;if(i===1&&r===0&&n){if(e.editor.inMultiSelectMode&&(e.getAccelKey()||e.getShiftKey()))return;this.mousedownEvent.time=Date.now();var o=e.domEvent.target||e.domEvent.srcElement;"unselectable"in o&&(o.unselectable="on");if(t.getDragDelay()){if(s.isWebKit){this.cancelDrag=!0;var u=t.container;u.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(e,this.onMouseDrag.bind(this)),e.defaultPrevented=!0}}}).call(f.prototype),t.DragdropHandler=f}),ace.define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("./dom");t.get=function(e,t){var n=new XMLHttpRequest;n.open("GET",e,!0),n.onreadystatechange=function(){n.readyState===4&&t(n.responseText)},n.send(null)},t.loadScript=function(e,t){var n=r.getDocumentHead(),i=document.createElement("script");i.src=e,n.appendChild(i),i.onload=i.onreadystatechange=function(e,n){if(n||!i.readyState||i.readyState=="loaded"||i.readyState=="complete")i=i.onload=i.onreadystatechange=null,n||t()}},t.qualifyURL=function(e){var t=document.createElement("a");return t.href=e,t.href}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;o1&&(i=n[n.length-2]);var o=a[t+"Path"];return o==null?o=a.basePath:r=="/"&&(t=r=""),o&&o.slice(-1)!="/"&&(o+="/"),o+t+r+i+this.get("suffix")},t.setModuleUrl=function(e,t){return a.$moduleUrls[e]=t},t.$loading={},t.loadModule=function(n,r){var i,o;Array.isArray(n)&&(o=n[0],n=n[1]);try{i=e(n)}catch(u){}if(i&&!t.$loading[n])return r&&r(i);t.$loading[n]||(t.$loading[n]=[]),t.$loading[n].push(r);if(t.$loading[n].length>1)return;var a=function(){e([n],function(e){t._emit("load.module",{name:n,module:e});var r=t.$loading[n];t.$loading[n]=null,r.forEach(function(t){t&&t(e)})})};if(!t.get("packaged"))return a();s.loadScript(t.moduleUrl(n,o),a)},t.init=f}),ace.define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(e,t,n){"use strict";var r=e("../lib/event"),i=e("../lib/useragent"),s=e("./default_handlers").DefaultHandlers,o=e("./default_gutter_handler").GutterHandler,u=e("./mouse_event").MouseEvent,a=e("./dragdrop_handler").DragdropHandler,f=e("../config"),l=function(e){var t=this;this.editor=e,new s(this),new o(this),new a(this);var n=function(t){var n=!document.hasFocus||!document.hasFocus()||!e.isFocused()&&document.activeElement==(e.textInput&&e.textInput.getElement());n&&window.focus(),e.focus()},u=e.renderer.getMouseEventTarget();r.addListener(u,"click",this.onMouseEvent.bind(this,"click")),r.addListener(u,"mousemove",this.onMouseMove.bind(this,"mousemove")),r.addMultiMouseDownListener([u,e.renderer.scrollBarV&&e.renderer.scrollBarV.inner,e.renderer.scrollBarH&&e.renderer.scrollBarH.inner,e.textInput&&e.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),r.addMouseWheelListener(e.container,this.onMouseWheel.bind(this,"mousewheel")),r.addTouchMoveListener(e.container,this.onTouchMove.bind(this,"touchmove"));var f=e.renderer.$gutter;r.addListener(f,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),r.addListener(f,"click",this.onMouseEvent.bind(this,"gutterclick")),r.addListener(f,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),r.addListener(f,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),r.addListener(u,"mousedown",n),r.addListener(f,"mousedown",n),i.isIE&&e.renderer.scrollBarV&&(r.addListener(e.renderer.scrollBarV.element,"mousedown",n),r.addListener(e.renderer.scrollBarH.element,"mousedown",n)),e.on("mousemove",function(n){if(t.state||t.$dragDelay||!t.$dragEnabled)return;var r=e.renderer.screenToTextCoordinates(n.x,n.y),i=e.session.selection.getRange(),s=e.renderer;!i.isEmpty()&&i.insideStart(r.row,r.column)?s.setCursorStyle("default"):s.setCursorStyle("")})};(function(){this.onMouseEvent=function(e,t){this.editor._emit(e,new u(t,this.editor))},this.onMouseMove=function(e,t){var n=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;if(!n||!n.length)return;this.editor._emit(e,new u(t,this.editor))},this.onMouseWheel=function(e,t){var n=new u(t,this.editor);n.speed=this.$scrollSpeed*2,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.onTouchMove=function(e,t){var n=new u(t,this.editor);n.speed=1,n.wheelX=t.wheelX,n.wheelY=t.wheelY,this.editor._emit(e,n)},this.setState=function(e){this.state=e},this.captureMouse=function(e,t){this.x=e.x,this.y=e.y,this.isMousePressed=!0;var n=this.editor.renderer;n.$keepTextAreaAtCursor&&(n.$keepTextAreaAtCursor=null);var s=this,o=function(e){if(!e)return;if(i.isWebKit&&!e.which&&s.releaseMouse)return s.releaseMouse();s.x=e.clientX,s.y=e.clientY,t&&t(e),s.mouseEvent=new u(e,s.editor),s.$mouseMoved=!0},a=function(e){clearInterval(l),f(),s[s.state+"End"]&&s[s.state+"End"](e),s.state="",n.$keepTextAreaAtCursor==null&&(n.$keepTextAreaAtCursor=!0,n.$moveTextAreaToCursor()),s.isMousePressed=!1,s.$onCaptureMouseMove=s.releaseMouse=null,e&&s.onMouseEvent("mouseup",e)},f=function(){s[s.state]&&s[s.state](),s.$mouseMoved=!1};if(i.isOldIE&&e.domEvent.type=="dblclick")return setTimeout(function(){a(e)});s.$onCaptureMouseMove=o,s.releaseMouse=r.capture(this.editor.container,o,a);var l=setInterval(f,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var e=function(t){if(t&&t.domEvent&&t.domEvent.type!="contextmenu")return;this.editor.off("nativecontextmenu",e),t&&t.domEvent&&r.stopEvent(t.domEvent)}.bind(this);setTimeout(e,10),this.editor.on("nativecontextmenu",e)}}).call(l.prototype),f.defineOptions(l.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:i.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),t.MouseHandler=l}),ace.define("ace/mouse/fold_handler",["require","exports","module"],function(e,t,n){"use strict";function r(e){e.on("click",function(t){var n=t.getDocumentPosition(),r=e.session,i=r.getFoldAt(n.row,n.column,1);i&&(t.getAccelKey()?r.removeFold(i):r.expandFold(i),t.stop())}),e.on("gutterclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session;i.foldWidgets&&i.foldWidgets[r]&&e.session.onFoldWidgetClick(r,t),e.isFocused()||e.focus(),t.stop()}}),e.on("gutterdblclick",function(t){var n=e.renderer.$gutterLayer.getRegion(t);if(n=="foldWidgets"){var r=t.getDocumentPosition().row,i=e.session,s=i.getParentFoldRangeData(r,!0),o=s.range||s.firstRange;if(o){r=o.start.row;var u=i.getFoldAt(r,i.getLine(r).length,1);u?i.removeFold(u):(i.addFold("...",o),e.renderer.scrollCursorIntoView({row:o.start.row,column:0}))}t.stop()}})}t.FoldHandler=r}),ace.define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(e,t,n){"use strict";var r=e("../lib/keys"),i=e("../lib/event"),s=function(e){this.$editor=e,this.$data={editor:e},this.$handlers=[],this.setDefaultHandler(e.commands)};(function(){this.setDefaultHandler=function(e){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=e,this.addKeyboardHandler(e,0)},this.setKeyboardHandler=function(e){var t=this.$handlers;if(t[t.length-1]==e)return;while(t[t.length-1]&&t[t.length-1]!=this.$defaultHandler)this.removeKeyboardHandler(t[t.length-1]);this.addKeyboardHandler(e,1)},this.addKeyboardHandler=function(e,t){if(!e)return;typeof e=="function"&&!e.handleKeyboard&&(e.handleKeyboard=e);var n=this.$handlers.indexOf(e);n!=-1&&this.$handlers.splice(n,1),t==undefined?this.$handlers.push(e):this.$handlers.splice(t,0,e),n==-1&&e.attach&&e.attach(this.$editor)},this.removeKeyboardHandler=function(e){var t=this.$handlers.indexOf(e);return t==-1?!1:(this.$handlers.splice(t,1),e.detach&&e.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var e=this.$data,t=e.editor;return this.$handlers.map(function(n){return n.getStatusText&&n.getStatusText(t,e)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(e,t,n,r){var s,o=!1,u=this.$editor.commands;for(var a=this.$handlers.length;a--;){s=this.$handlers[a].handleKeyboard(this.$data,e,t,n,r);if(!s||!s.command)continue;s.command=="null"?o=!0:o=u.exec(s.command,this.$editor,s.args,r),o&&r&&e!=-1&&s.passEvent!=1&&s.command.passEvent!=1&&i.stopEvent(r);if(o)break}return!o&&e==-1&&(s={command:"insertstring"},o=u.exec("insertstring",this.$editor,t)),o&&this.$editor._signal("keyboardActivity",s),o},this.onCommandKey=function(e,t,n){var i=r.keyCodeToString(n);this.$callKeyboardHandlers(t,i,n,e)},this.onTextInput=function(e){this.$callKeyboardHandlers(-1,e)}}).call(s.prototype),t.KeyBinding=s}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.rowt.row||e.row==t.row&&e.column>t.column},this.getRange=function(){var e=this.anchor,t=this.lead;return this.isEmpty()?o.fromPoints(t,t):this.isBackwards()?o.fromPoints(t,e):o.fromPoints(e,t)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var e=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(e,this.doc.getLine(e).length)},this.setRange=this.setSelectionRange=function(e,t){t?(this.setSelectionAnchor(e.end.row,e.end.column),this.selectTo(e.start.row,e.start.column)):(this.setSelectionAnchor(e.start.row,e.start.column),this.selectTo(e.end.row,e.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(e){var t=this.lead;this.$isEmpty&&this.setSelectionAnchor(t.row,t.column),e.call(this)},this.selectTo=function(e,t){this.$moveSelection(function(){this.moveCursorTo(e,t)})},this.selectToPosition=function(e){this.$moveSelection(function(){this.moveCursorToPosition(e)})},this.moveTo=function(e,t){this.clearSelection(),this.moveCursorTo(e,t)},this.moveToPosition=function(e){this.clearSelection(),this.moveCursorToPosition(e)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(e,t){if(typeof t=="undefined"){var n=e||this.lead;e=n.row,t=n.column}return this.session.getWordRange(e,t)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var e=this.getCursor(),t=this.session.getAWordRange(e.row,e.column);this.setSelectionRange(t)},this.getLineRange=function(e,t){var n=typeof e=="number"?e:this.lead.row,r,i=this.session.getFoldLine(n);return i?(n=i.start.row,r=i.end.row):r=n,t===!0?new o(n,0,r,this.session.getLine(r).length):new o(n,0,r+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,-1))this.moveCursorTo(t.start.row,t.start.column);else if(e.column===0)e.row>0&&this.moveCursorTo(e.row-1,this.doc.getLine(e.row-1).length);else{var n=this.session.getTabSize();this.session.isTabStop(e)&&this.doc.getLine(e.row).slice(e.column-n,e.column).split(" ").length-1==n?this.moveCursorBy(0,-n):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var e=this.lead.getPosition(),t;if(t=this.session.getFoldAt(e.row,e.column,1))this.moveCursorTo(t.end.row,t.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(t.column=r)}}this.moveCursorTo(t.row,t.column)},this.moveCursorFileEnd=function(){var e=this.doc.getLength()-1,t=this.doc.getLine(e).length;this.moveCursorTo(e,t)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i;this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var s=this.session.getFoldAt(e,t,1);if(s){this.moveCursorTo(s.end.row,s.end.column);return}if(i=this.session.nonTokenRe.exec(r))t+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,r=n.substring(t);if(t>=n.length){this.moveCursorTo(e,n.length),this.moveCursorRight(),e0&&this.moveCursorWordLeft();return}if(o=this.session.tokenRe.exec(s))t-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0;this.moveCursorTo(e,t)},this.$shortWordEndIndex=function(e){var t,n=0,r,i=/\s/,s=this.session.tokenRe;s.lastIndex=0;if(t=this.session.tokenRe.exec(e))n=this.session.tokenRe.lastIndex;else{while((r=e[n])&&i.test(r))n++;if(n<1){s.lastIndex=0;while((r=e[n])&&!s.test(r)){s.lastIndex=0,n++;if(i.test(r)){if(n>2){n--;break}while((r=e[n])&&i.test(r))n++;if(n>2)break}}}}return s.lastIndex=0,n},this.moveCursorShortWordRight=function(){var e=this.lead.row,t=this.lead.column,n=this.doc.getLine(e),r=n.substring(t),i=this.session.getFoldAt(e,t,1);if(i)return this.moveCursorTo(i.end.row,i.end.column);if(t==n.length){var s=this.doc.getLength();do e++,r=this.doc.getLine(e);while(e0&&/^\s*$/.test(r));t=r.length,/\s+$/.test(r)||(r="")}var s=i.stringReverse(r),o=this.$shortWordEndIndex(s);return this.moveCursorTo(e,t-o)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(e,t){var n=this.session.documentToScreenPosition(this.lead.row,this.lead.column);t===0&&(this.$desiredColumn?n.column=this.$desiredColumn:this.$desiredColumn=n.column);var r=this.session.screenToDocumentPosition(n.row+e,n.column);e!==0&&t===0&&r.row===this.lead.row&&r.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[r.row]&&(r.row>0||e>0)&&r.row++,this.moveCursorTo(r.row,r.column+t,t===0)},this.moveCursorToPosition=function(e){this.moveCursorTo(e.row,e.column)},this.moveCursorTo=function(e,t,n){var r=this.session.getFoldAt(e,t,1);r&&(e=r.start.row,t=r.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(e,t),this.$keepDesiredColumnOnChange=!1,n||(this.$desiredColumn=null)},this.moveCursorToScreen=function(e,t,n){var r=this.session.screenToDocumentPosition(e,t);this.moveCursorTo(r.row,r.column,n)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(e){this.setSelectionRange(e,e.cursor==e.start),this.$desiredColumn=e.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(e){var t=this.getRange();return e?(e.start.column=t.start.column,e.start.row=t.start.row,e.end.column=t.end.column,e.end.row=t.end.row):e=t,e.cursor=this.isBackwards()?e.start:e.end,e.desiredColumn=this.$desiredColumn,e},this.getRangeOfMovements=function(e){var t=this.getCursor();try{e(this);var n=this.getCursor();return o.fromPoints(t,n)}catch(r){return o.fromPoints(t,t)}finally{this.moveCursorToPosition(t)}},this.toJSON=function(){if(this.rangeCount)var e=this.ranges.map(function(e){var t=e.clone();return t.isBackwards=e.cursor==e.start,t});else{var e=this.getRange();e.isBackwards=this.isBackwards()}return e},this.fromJSON=function(e){if(e.start==undefined){if(this.rangeList){this.toSingleRange(e[0]);for(var t=e.length;t--;){var n=o.fromPoints(e[t].start,e[t].end);e[t].isBackwards&&(n.cursor=n.start),this.addRange(n,!0)}return}e=e[0]}this.rangeList&&this.toSingleRange(e),this.setSelectionRange(e,e.isBackwards)},this.isEqual=function(e){if((e.length||this.rangeCount)&&e.length!=this.rangeCount)return!1;if(!e.length||!this.ranges)return this.getRange().isEqual(e);for(var t=this.ranges.length;t--;)if(!this.ranges[t].isEqual(e[t]))return!1;return!0}}).call(u.prototype),t.Selection=u}),ace.define("ace/tokenizer",["require","exports","module","ace/config"],function(e,t,n){"use strict";var r=e("./config"),i=2e3,s=function(e){this.states=e,this.regExps={},this.matchMappings={};for(var t in this.states){var n=this.states[t],r=[],i=0,s=this.matchMappings[t]={defaultToken:"text"},o="g",u=[];for(var a=0;a1?f.onMatch=this.$applyToken:f.onMatch=f.token),c>1&&(/\\\d/.test(f.regex)?l=f.regex.replace(/\\([0-9]+)/g,function(e,t){return"\\"+(parseInt(t,10)+i+1)}):(c=1,l=this.removeCapturingGroups(f.regex)),!f.splitRegex&&typeof f.token!="string"&&u.push(f)),s[i]=a,i+=c,r.push(l),f.onMatch||(f.onMatch=null)}r.length||(s[0]=0,r.push("$")),u.forEach(function(e){e.splitRegex=this.createSplitterRegexp(e.regex,o)},this),this.regExps[t]=new RegExp("("+r.join(")|(")+")|($)",o)}};(function(){this.$setMaxTokenCount=function(e){i=e|0},this.$applyToken=function(e){var t=this.splitRegex.exec(e).slice(1),n=this.token.apply(this,t);if(typeof n=="string")return[{type:n,value:e}];var r=[];for(var i=0,s=n.length;il){var g=e.substring(l,m-v.length);h.type==p?h.value+=g:(h.type&&f.push(h),h={type:p,value:g})}for(var y=0;yi){c>2*e.length&&this.reportError("infinite loop with in ace tokenizer",{startState:t,line:e});while(l1&&n[0]!==r&&n.unshift("#tmp",r),{tokens:f,state:n.length?n:r}},this.reportError=r.reportError}).call(s.prototype),t.Tokenizer=s}),ace.define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../lib/lang"),i=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(e,t){if(!t){for(var n in e)this.$rules[n]=e[n];return}for(var n in e){var r=e[n];for(var i=0;i=this.$rowTokens.length){this.$row+=1,e||(e=this.$session.getLength());if(this.$row>=e)return this.$row=e-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var e=this.$rowTokens,t=this.$tokenIndex,n=e[t].start;if(n!==undefined)return n;n=0;while(t>0)t-=1,n+=e[t].value.length;return n},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(r.prototype),t.TokenIterator=r}),ace.define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(e,t,n){"use strict";var r=e("../tokenizer").Tokenizer,i=e("./text_highlight_rules").TextHighlightRules,s=e("./behaviour").Behaviour,o=e("../unicode"),u=e("../lib/lang"),a=e("../token_iterator").TokenIterator,f=e("../range").Range,l=function(){this.HighlightRules=i,this.$behaviour=new s};(function(){this.tokenRe=new RegExp("^["+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+o.packages.L+o.packages.Mn+o.packages.Mc+o.packages.Nd+o.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules,this.$tokenizer=new r(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(e,t,n,r){function w(e){for(var t=n;t<=r;t++)e(i.getLine(t),t)}var i=t.doc,s=!0,o=!0,a=Infinity,f=t.getTabSize(),l=!1;if(!this.lineCommentStart){if(!this.blockComment)return!1;var c=this.blockComment.start,h=this.blockComment.end,p=new RegExp("^(\\s*)(?:"+u.escapeRegExp(c)+")"),d=new RegExp("(?:"+u.escapeRegExp(h)+")\\s*$"),v=function(e,t){if(g(e,t))return;if(!s||/\S/.test(e))i.insertInLine({row:t,column:e.length},h),i.insertInLine({row:t,column:a},c)},m=function(e,t){var n;(n=e.match(d))&&i.removeInLine(t,e.length-n[0].length,e.length),(n=e.match(p))&&i.removeInLine(t,n[1].length,n[0].length)},g=function(e,n){if(p.test(e))return!0;var r=t.getTokens(n);for(var i=0;i2?r%f!=f-1:r%f==0}}var E=Infinity;w(function(e,t){var n=e.search(/\S/);n!==-1?(ne.length&&(E=e.length)}),a==Infinity&&(a=E,s=!1,o=!1),l&&a%f!=0&&(a=Math.floor(a/f)*f),w(o?m:v)},this.toggleBlockComment=function(e,t,n,r){var i=this.blockComment;if(!i)return;!i.start&&i[0]&&(i=i[0]);var s=new a(t,r.row,r.column),o=s.getCurrentToken(),u=t.selection,l=t.selection.toOrientedRange(),c,h;if(o&&/comment/.test(o.type)){var p,d;while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.start);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;p=new f(m,g,m,g+i.start.length);break}o=s.stepBackward()}var s=new a(t,r.row,r.column),o=s.getCurrentToken();while(o&&/comment/.test(o.type)){var v=o.value.indexOf(i.end);if(v!=-1){var m=s.getCurrentTokenRow(),g=s.getCurrentTokenColumn()+v;d=new f(m,g,m,g+i.end.length);break}o=s.stepForward()}d&&t.remove(d),p&&(t.remove(p),c=p.start.row,h=-i.start.length)}else h=i.start.length,c=n.start.row,t.insert(n.end,i.end),t.insert(n.start,i.start);l.start.row==c&&(l.start.column+=h),l.end.row==c&&(l.end.column+=h),t.selection.fromOrientedRange(l)},this.getNextLineIndent=function(e,t,n){return this.$getIndent(t)},this.checkOutdent=function(e,t,n){return!1},this.autoOutdent=function(e,t,n){},this.$getIndent=function(e){return e.match(/^\s*/)[0]},this.createWorker=function(e){return null},this.createModeDelegates=function(e){this.$embeds=[],this.$modes={};for(var t in e)e[t]&&(this.$embeds.push(t),this.$modes[t]=new e[t]);var n=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"];for(var t=0;t=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/event_emitter").EventEmitter,s=t.Anchor=function(e,t,n){this.$onChange=this.onChange.bind(this),this.attach(e),typeof n=="undefined"?this.setPosition(t.row,t.column):this.setPosition(t,n)};(function(){function e(e,t,n){var r=n?e.column<=t.column:e.columnthis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i20){n.running=setTimeout(n.$worker,20);break}}n.currentLine=t,s<=r&&n.fireUpdateEvent(s,r)}};(function(){r.implement(this,i),this.setTokenizer=function(e){this.tokenizer=e,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(e){this.doc=e,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(e,t){var n={first:e,last:t};this._signal("update",{data:n})},this.start=function(e){this.currentLine=Math.min(e||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.lines[t]=null;else if(e.action=="remove")this.lines.splice(t,n+1,null),this.states.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.lines.splice.apply(this.lines,r),this.states.splice.apply(this.states,r)}this.currentLine=Math.min(t,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(e){return this.lines[e]||this.$tokenizeRow(e)},this.getState=function(e){return this.currentLine==e&&this.$tokenizeRow(e),this.states[e]||"start"},this.$tokenizeRow=function(e){var t=this.doc.getLine(e),n=this.states[e-1],r=this.tokenizer.getLineTokens(t,n,e);return this.states[e]+""!=r.state+""?(this.states[e]=r.state,this.lines[e+1]=null,this.currentLine>e+1&&(this.currentLine=e+1)):this.currentLine==e&&(this.currentLine=e+1),this.lines[e]=r.tokens}}).call(s.prototype),t.BackgroundTokenizer=s}),ace.define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(e,t,n){this.setRegexp(e),this.clazz=t,this.type=n||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(e){if(this.regExp+""==e+"")return;this.regExp=e,this.cache=[]},this.update=function(e,t,n,i){if(!this.regExp)return;var o=i.firstRow,u=i.lastRow;for(var a=o;a<=u;a++){var f=this.cache[a];f==null&&(f=r.getMatchOffsets(n.getLine(a),this.regExp),f.length>this.MAX_RANGES&&(f=f.slice(0,this.MAX_RANGES)),f=f.map(function(e){return new s(a,e.offset,a,e.offset+e.length)}),this.cache[a]=f.length?f:"");for(var l=f.length;l--;)t.drawSingleLineMarker(e,f[l].toScreenRange(n),this.clazz,i)}}}).call(o.prototype),t.SearchHighlight=o}),ace.define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(e,t,n){"use strict";function i(e,t){this.foldData=e,Array.isArray(t)?this.folds=t:t=this.folds=[t];var n=t[t.length-1];this.range=new r(t[0].start.row,t[0].start.column,n.end.row,n.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(e){e.setFoldLine(this)},this)}var r=e("../range").Range;(function(){this.shiftRow=function(e){this.start.row+=e,this.end.row+=e,this.folds.forEach(function(t){t.start.row+=e,t.end.row+=e})},this.addFold=function(e){if(e.sameRow){if(e.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(e),this.folds.sort(function(e,t){return-e.range.compareEnd(t.start.row,t.start.column)}),this.range.compareEnd(e.start.row,e.start.column)>0?(this.end.row=e.end.row,this.end.column=e.end.column):this.range.compareStart(e.end.row,e.end.column)<0&&(this.start.row=e.start.row,this.start.column=e.start.column)}else if(e.start.row==this.end.row)this.folds.push(e),this.end.row=e.end.row,this.end.column=e.end.column;else{if(e.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(e),this.start.row=e.start.row,this.start.column=e.start.column}e.foldLine=this},this.containsRow=function(e){return e>=this.start.row&&e<=this.end.row},this.walk=function(e,t,n){var r=0,i=this.folds,s,o,u,a=!0;t==null&&(t=this.end.row,n=this.end.column);for(var f=0;f0)continue;var a=i(e,o.start);return u===0?t&&a!==0?-s-2:s:a>0||a===0&&!t?s:-s-1}return-s-1},this.add=function(e){var t=!e.isEmpty(),n=this.pointIndex(e.start,t);n<0&&(n=-n-1);var r=this.pointIndex(e.end,t,n);return r<0?r=-r-1:r++,this.ranges.splice(n,r-n,e)},this.addList=function(e){var t=[];for(var n=e.length;n--;)t.push.apply(t,this.add(e[n]));return t},this.substractPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges.splice(t,1)},this.merge=function(){var e=[],t=this.ranges;t=t.sort(function(e,t){return i(e.start,t.start)});var n=t[0],r;for(var s=1;s=0},this.containsPoint=function(e){return this.pointIndex(e)>=0},this.rangeAtPoint=function(e){var t=this.pointIndex(e);if(t>=0)return this.ranges[t]},this.clipRows=function(e,t){var n=this.ranges;if(n[0].start.row>t||n[n.length-1].start.rowr)break;l.start.row==r&&l.start.column>=t.column&&(l.start.column!=t.column||!this.$insertRight)&&(l.start.column+=o,l.start.row+=s);if(l.end.row==r&&l.end.column>=t.column){if(l.end.column==t.column&&this.$insertRight)continue;l.end.column==t.column&&o>0&&al.start.column&&l.end.column==u[a+1].start.column&&(l.end.column-=o),l.end.column+=o,l.end.row+=s}}if(s!=0&&a=e)return i;if(i.end.row>e)return null}return null},this.getNextFoldLine=function(e,t){var n=this.$foldData,r=0;t&&(r=n.indexOf(t)),r==-1&&(r=0);for(r;r=e)return i}return null},this.getFoldedRowCount=function(e,t){var n=this.$foldData,r=t-e+1;for(var i=0;i=t){u=e?r-=t-u:r=0);break}o>=e&&(u>=e?r-=o-u:r-=o-e+1)}return r},this.$addFoldLine=function(e){return this.$foldData.push(e),this.$foldData.sort(function(e,t){return e.start.row-t.start.row}),e},this.addFold=function(e,t){var n=this.$foldData,r=!1,o;e instanceof s?o=e:(o=new s(t,e),o.collapseChildren=t.collapseChildren),this.$clipRangeToDocument(o.range);var u=o.start.row,a=o.start.column,f=o.end.row,l=o.end.column;if(u0&&(this.removeFolds(p),p.forEach(function(e){o.addSubFold(e)}));for(var d=0;d0&&this.foldAll(e.start.row+1,e.end.row,e.collapseChildren-1),e.subFolds=[]},this.expandFolds=function(e){e.forEach(function(e){this.expandFold(e)},this)},this.unfold=function(e,t){var n,i;e==null?(n=new r(0,0,this.getLength(),0),t=!0):typeof e=="number"?n=new r(e,0,e,this.getLine(e).length):"row"in e?n=r.fromPoints(e,e):n=e,i=this.getFoldsInRangeList(n);if(t)this.removeFolds(i);else{var s=i;while(s.length)this.expandFolds(s),s=this.getFoldsInRangeList(n)}if(i.length)return i},this.isRowFolded=function(e,t){return!!this.getFoldLine(e,t)},this.getRowFoldEnd=function(e,t){var n=this.getFoldLine(e,t);return n?n.end.row:e},this.getRowFoldStart=function(e,t){var n=this.getFoldLine(e,t);return n?n.start.row:e},this.getFoldDisplayLine=function(e,t,n,r,i){r==null&&(r=e.start.row),i==null&&(i=0),t==null&&(t=e.end.row),n==null&&(n=this.getLine(t).length);var s=this.doc,o="";return e.walk(function(e,t,n,u){if(t=e){i=s.end.row;try{var o=this.addFold("...",s);o&&(o.collapseChildren=n)}catch(u){}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(e){if(!this.$foldStyles[e])throw new Error("invalid fold style: "+e+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle==e)return;this.$foldStyle=e,e=="manual"&&this.unfold();var t=this.$foldMode;this.$setFolding(null),this.$setFolding(t)},this.$setFolding=function(e){if(this.$foldMode==e)return;this.$foldMode=e,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation");if(!e||this.$foldStyle=="manual"){this.foldWidgets=null;return}this.foldWidgets=[],this.getFoldWidget=e.getFoldWidget.bind(e,this,this.$foldStyle),this.getFoldWidgetRange=e.getFoldWidgetRange.bind(e,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)},this.getParentFoldRangeData=function(e,t){var n=this.foldWidgets;if(!n||t&&n[e])return{};var r=e-1,i;while(r>=0){var s=n[r];s==null&&(s=n[r]=this.getFoldWidget(r));if(s=="start"){var o=this.getFoldWidgetRange(r);i||(i=o);if(o&&o.end.row>=e)break}r--}return{range:r!==-1&&o,firstRange:i}},this.onFoldWidgetClick=function(e,t){t=t.domEvent;var n={children:t.shiftKey,all:t.ctrlKey||t.metaKey,siblings:t.altKey},r=this.$toggleFoldWidget(e,n);if(!r){var i=t.target||t.srcElement;i&&/ace_fold-widget/.test(i.className)&&(i.className+=" ace_invalid")}},this.$toggleFoldWidget=function(e,t){if(!this.getFoldWidget)return;var n=this.getFoldWidget(e),r=this.getLine(e),i=n==="end"?-1:1,s=this.getFoldAt(e,i===-1?0:r.length,i);if(s){t.children||t.all?this.removeFold(s):this.expandFold(s);return}var o=this.getFoldWidgetRange(e,!0);if(o&&!o.isMultiLine()){s=this.getFoldAt(o.start.row,o.start.column,1);if(s&&o.isEqual(s.range)){this.removeFold(s);return}}if(t.siblings){var u=this.getParentFoldRangeData(e);if(u.range)var a=u.range.start.row+1,f=u.range.end.row;this.foldAll(a,f,t.all?1e4:0)}else t.children?(f=o?o.end.row:this.getLength(),this.foldAll(e+1,f,t.all?1e4:0)):o&&(t.all&&(o.collapseChildren=1e4),this.addFold("...",o));return o},this.toggleFoldWidget=function(e){var t=this.selection.getCursor().row;t=this.getRowFoldStart(t);var n=this.$toggleFoldWidget(t,{});if(n)return;var r=this.getParentFoldRangeData(t,!0);n=r.range||r.firstRange;if(n){t=n.start.row;var i=this.getFoldAt(t,this.getLine(t).length,1);i?this.removeFold(i):this.addFold("...",n)}},this.updateFoldWidgets=function(e){var t=e.start.row,n=e.end.row-t;if(n===0)this.foldWidgets[t]=null;else if(e.action=="remove")this.foldWidgets.splice(t,n+1,null);else{var r=Array(n+1);r.unshift(t,1),this.foldWidgets.splice.apply(this.foldWidgets,r)}},this.tokenizerUpdateFoldWidgets=function(e){var t=e.data;t.first!=t.last&&this.foldWidgets.length>t.first&&this.foldWidgets.splice(t.first,this.foldWidgets.length)}}var r=e("../range").Range,i=e("./fold_line").FoldLine,s=e("./fold").Fold,o=e("../token_iterator").TokenIterator;t.Folding=u}),ace.define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(e,t,n){"use strict";function s(){this.findMatchingBracket=function(e,t){if(e.column==0)return null;var n=t||this.getLine(e.row).charAt(e.column-1);if(n=="")return null;var r=n.match(/([\(\[\{])|([\)\]\}])/);return r?r[1]?this.$findClosingBracket(r[1],e):this.$findOpeningBracket(r[2],e):null},this.getBracketRange=function(e){var t=this.getLine(e.row),n=!0,r,s=t.charAt(e.column-1),o=s&&s.match(/([\(\[\{])|([\)\]\}])/);o||(s=t.charAt(e.column),e={row:e.row,column:e.column+1},o=s&&s.match(/([\(\[\{])|([\)\]\}])/),n=!1);if(!o)return null;if(o[1]){var u=this.$findClosingBracket(o[1],e);if(!u)return null;r=i.fromPoints(e,u),n||(r.end.column++,r.start.column--),r.cursor=r.end}else{var u=this.$findOpeningBracket(o[2],e);if(!u)return null;r=i.fromPoints(u,e),n||(r.start.column++,r.end.column--),r.cursor=r.start}return r},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn()-2,f=u.value;for(;;){while(a>=0){var l=f.charAt(a);if(l==i){s-=1;if(s==0)return{row:o.getCurrentTokenRow(),column:a+o.getCurrentTokenColumn()}}else l==e&&(s+=1);a-=1}do u=o.stepBackward();while(u&&!n.test(u.type));if(u==null)break;f=u.value,a=f.length-1}return null},this.$findClosingBracket=function(e,t,n){var i=this.$brackets[e],s=1,o=new r(this,t.row,t.column),u=o.getCurrentToken();u||(u=o.stepForward());if(!u)return;n||(n=new RegExp("(\\.?"+u.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));var a=t.column-o.getCurrentTokenColumn();for(;;){var f=u.value,l=f.length;while(a=4352&&e<=4447||e>=4515&&e<=4519||e>=4602&&e<=4607||e>=9001&&e<=9002||e>=11904&&e<=11929||e>=11931&&e<=12019||e>=12032&&e<=12245||e>=12272&&e<=12283||e>=12288&&e<=12350||e>=12353&&e<=12438||e>=12441&&e<=12543||e>=12549&&e<=12589||e>=12593&&e<=12686||e>=12688&&e<=12730||e>=12736&&e<=12771||e>=12784&&e<=12830||e>=12832&&e<=12871||e>=12880&&e<=13054||e>=13056&&e<=19903||e>=19968&&e<=42124||e>=42128&&e<=42182||e>=43360&&e<=43388||e>=44032&&e<=55203||e>=55216&&e<=55238||e>=55243&&e<=55291||e>=63744&&e<=64255||e>=65040&&e<=65049||e>=65072&&e<=65106||e>=65108&&e<=65126||e>=65128&&e<=65131||e>=65281&&e<=65376||e>=65504&&e<=65510}r.implement(this,o),this.setDocument=function(e){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=e,e.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(e){if(!e){this.$docRowCache=[],this.$screenRowCache=[];return}var t=this.$docRowCache.length,n=this.$getRowCacheIndex(this.$docRowCache,e)+1;t>n&&(this.$docRowCache.splice(n,t),this.$screenRowCache.splice(n,t))},this.$getRowCacheIndex=function(e,t){var n=0,r=e.length-1;while(n<=r){var i=n+r>>1,s=e[i];if(t>s)n=i+1;else{if(!(t=t)break}return r=n[s],r?(r.index=s,r.start=i-r.value.length,r):null},this.setUndoManager=function(e){this.$undoManager=e,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel();if(e){var t=this;this.$syncInformUndoManager=function(){t.$informUndoManager.cancel(),t.$deltasFold.length&&(t.$deltas.push({group:"fold",deltas:t.$deltasFold}),t.$deltasFold=[]),t.$deltasDoc.length&&(t.$deltas.push({group:"doc",deltas:t.$deltasDoc}),t.$deltasDoc=[]),t.$deltas.length>0&&e.execute({action:"aceupdate",args:[t.$deltas,t],merge:t.mergeUndoDeltas}),t.mergeUndoDeltas=!1,t.$deltas=[]},this.$informUndoManager=i.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?i.stringRepeat(" ",this.getTabSize()):" "},this.setUseSoftTabs=function(e){this.setOption("useSoftTabs",e)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(e){this.setOption("tabSize",e)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(e){return this.$useSoftTabs&&e.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(e){this.setOption("overwrite",e)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(e,t){this.$decorations[e]||(this.$decorations[e]=""),this.$decorations[e]+=" "+t,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(e,t){this.$decorations[e]=(this.$decorations[e]||"").replace(" "+t,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(e){this.$breakpoints=[];for(var t=0;t0&&(r=!!n.charAt(t-1).match(this.tokenRe)),r||(r=!!n.charAt(t).match(this.tokenRe));if(r)var i=this.tokenRe;else if(/^\s+$/.test(n.slice(t-1,t+1)))var i=/\s/;else var i=this.nonTokenRe;var s=t;if(s>0){do s--;while(s>=0&&n.charAt(s).match(i));s++}var o=t;while(oe&&(e=t.screenWidth)}),this.lineWidgetWidth=e},this.$computeWidth=function(e){if(this.$modified||e){this.$modified=!1;if(this.$useWrapMode)return this.screenWidth=this.$wrapLimit;var t=this.doc.getAllLines(),n=this.$rowLengthCache,r=0,i=0,s=this.$foldData[i],o=s?s.start.row:Infinity,u=t.length;for(var a=0;ao){a=s.end.row+1;if(a>=u)break;s=this.$foldData[i++],o=s?s.start.row:Infinity}n[a]==null&&(n[a]=this.$getStringScreenWidth(t[a])[0]),n[a]>r&&(r=n[a])}this.screenWidth=r}},this.getLine=function(e){return this.doc.getLine(e)},this.getLines=function(e,t){return this.doc.getLines(e,t)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(e){return this.doc.getTextRange(e||this.selection.getRange())},this.insert=function(e,t){return this.doc.insert(e,t)},this.remove=function(e){return this.doc.remove(e)},this.removeFullLines=function(e,t){return this.doc.removeFullLines(e,t)},this.undoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=e.length-1;r!=-1;r--){var i=e[r];i.group=="doc"?(this.doc.revertDeltas(i.deltas),n=this.$getUndoSelection(i.deltas,!0,n)):i.deltas.forEach(function(e){this.addFolds(e.folds)},this)}return this.$fromUndo=!1,n&&this.$undoSelect&&!t&&this.selection.setSelectionRange(n),n},this.redoChanges=function(e,t){if(!e.length)return;this.$fromUndo=!0;var n=null;for(var r=0;re.end.column&&(s.start.column+=u),s.end.row==e.end.row&&s.end.column>e.end.column&&(s.end.column+=u)),o&&s.start.row>=e.end.row&&(s.start.row+=o,s.end.row+=o)}s.end=this.insert(s.start,r);if(i.length){var a=e.start,l=s.start,o=l.row-a.row,u=l.column-a.column;this.addFolds(i.map(function(e){return e=e.clone(),e.start.row==a.row&&(e.start.column+=u),e.end.row==a.row&&(e.end.column+=u),e.start.row+=o,e.end.row+=o,e}))}return s},this.indentRows=function(e,t,n){n=n.replace(/\t/g,this.getTabString());for(var r=e;r<=t;r++)this.doc.insertInLine({row:r,column:0},n)},this.outdentRows=function(e){var t=e.collapseRows(),n=new f(0,0,0,0),r=this.getTabSize();for(var i=t.start.row;i<=t.end.row;++i){var s=this.getLine(i);n.start.row=i,n.end.row=i;for(var o=0;o0){var r=this.getRowFoldEnd(t+n);if(r>this.doc.getLength()-1)return 0;var i=r-t}else{e=this.$clipRowToDocument(e),t=this.$clipRowToDocument(t);var i=t-e+1}var s=new f(e,0,t,Number.MAX_VALUE),o=this.getFoldsInRange(s).map(function(e){return e=e.clone(),e.start.row+=i,e.end.row+=i,e}),u=n==0?this.doc.getLines(e,t):this.doc.removeFullLines(e,t);return this.doc.insertFullLines(e+i,u),o.length&&this.addFolds(o),i},this.moveLinesUp=function(e,t){return this.$moveLines(e,t,-1)},this.moveLinesDown=function(e,t){return this.$moveLines(e,t,1)},this.duplicateLines=function(e,t){return this.$moveLines(e,t,0)},this.$clipRowToDocument=function(e){return Math.max(0,Math.min(e,this.doc.getLength()-1))},this.$clipColumnToRow=function(e,t){return t<0?0:Math.min(this.doc.getLine(e).length,t)},this.$clipPositionToDocument=function(e,t){t=Math.max(0,t);if(e<0)e=0,t=0;else{var n=this.doc.getLength();e>=n?(e=n-1,t=this.doc.getLine(n-1).length):t=Math.min(this.doc.getLine(e).length,t)}return{row:e,column:t}},this.$clipRangeToDocument=function(e){e.start.row<0?(e.start.row=0,e.start.column=0):e.start.column=this.$clipColumnToRow(e.start.row,e.start.column);var t=this.doc.getLength()-1;return e.end.row>t?(e.end.row=t,e.end.column=this.doc.getLine(t).length):e.end.column=this.$clipColumnToRow(e.end.row,e.end.column),e},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(e){if(e!=this.$useWrapMode){this.$useWrapMode=e,this.$modified=!0,this.$resetRowCache(0);if(e){var t=this.getLength();this.$wrapData=Array(t),this.$updateWrapData(0,t-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(e,t){if(this.$wrapLimitRange.min!==e||this.$wrapLimitRange.max!==t)this.$wrapLimitRange={min:e,max:t},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode")},this.adjustWrapLimit=function(e,t){var n=this.$wrapLimitRange;n.max<0&&(n={min:t,max:t});var r=this.$constrainWrapLimit(e,n.min,n.max);return r!=this.$wrapLimit&&r>1?(this.$wrapLimit=r,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0):!1},this.$constrainWrapLimit=function(e,t,n){return t&&(e=Math.max(t,e)),n&&(e=Math.min(n,e)),e},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(e){this.setWrapLimitRange(e,e)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(e){var t=this.$useWrapMode,n=e.action,r=e.start,i=e.end,s=r.row,o=i.row,u=o-s,a=null;this.$updating=!0;if(u!=0)if(n==="remove"){this[t?"$wrapData":"$rowLengthCache"].splice(s,u);var f=this.$foldData;a=this.getFoldsInRange(e),this.removeFolds(a);var l=this.getFoldLine(i.row),c=0;if(l){l.addRemoveChars(i.row,i.column,r.column-i.column),l.shiftRow(-u);var h=this.getFoldLine(s);h&&h!==l&&(h.merge(l),l=h),c=f.indexOf(l)+1}for(c;c=i.row&&l.shiftRow(-u)}o=s}else{var p=Array(u);p.unshift(s,0);var d=t?this.$wrapData:this.$rowLengthCache;d.splice.apply(d,p);var f=this.$foldData,l=this.getFoldLine(s),c=0;if(l){var v=l.range.compareInside(r.row,r.column);v==0?(l=l.split(r.row,r.column),l&&(l.shiftRow(u),l.addRemoveChars(o,0,i.column-r.column))):v==-1&&(l.addRemoveChars(s,0,i.column-r.column),l.shiftRow(u)),c=f.indexOf(l)+1}for(c;c=s&&l.shiftRow(u)}}else{u=Math.abs(e.start.column-e.end.column),n==="remove"&&(a=this.getFoldsInRange(e),this.removeFolds(a),u=-u);var l=this.getFoldLine(s);l&&l.addRemoveChars(s,r.column,u)}return t&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,t?this.$updateWrapData(s,o):this.$updateRowLengthCache(s,o),a},this.$updateRowLengthCache=function(e,t,n){this.$rowLengthCache[e]=null,this.$rowLengthCache[t]=null},this.$updateWrapData=function(e,t){var r=this.doc.getAllLines(),i=this.getTabSize(),s=this.$wrapData,o=this.$wrapLimit,a,f,l=e;t=Math.min(t,r.length-1);while(l<=t)f=this.getFoldLine(l,f),f?(a=[],f.walk(function(e,t,i,s){var o;if(e!=null){o=this.$getDisplayTokens(e,a.length),o[0]=n;for(var f=1;fr-b){var w=a+r-b;if(e[w-1]>=p&&e[w]>=p){y(w);continue}if(e[w]==n||e[w]==u){for(w;w!=a-1;w--)if(e[w]==n)break;if(w>a){y(w);continue}w=a+r;for(w;w>2)),a-1);while(w>E&&e[w]E&&e[w]E&&e[w]==l)w--}else while(w>E&&e[w]E){y(++w);continue}w=a+r,e[w]==t&&w--,y(w-b)}return s},this.$getDisplayTokens=function(n,r){var i=[],s;r=r||0;for(var o=0;o39&&u<48||u>57&&u<64?i.push(l):u>=4352&&m(u)?i.push(e,t):i.push(e)}return i},this.$getStringScreenWidth=function(e,t,n){if(t==0)return[0,0];t==null&&(t=Infinity),n=n||0;var r,i;for(i=0;i=4352&&m(r)?n+=2:n+=1;if(n>t)break}return[n,i]},this.lineWidgets=null,this.getRowLength=function(e){if(this.lineWidgets)var t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0;else t=0;return!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.getRowLineCount=function(e){return!this.$useWrapMode||!this.$wrapData[e]?1:this.$wrapData[e].length+1},this.getRowWrapIndent=function(e){if(this.$useWrapMode){var t=this.screenToDocumentPosition(e,Number.MAX_VALUE),n=this.$wrapData[t.row];return n.length&&n[0]=0)var o=a[f],r=this.$docRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getLength()-1,p=this.getNextFoldLine(r),d=p?p.start.row:Infinity;while(o<=e){u=this.getRowLength(r);if(o+u>e||r>=h)break;o+=u,r++,r>d&&(r=p.end.row+1,p=this.getNextFoldLine(r,p),d=p?p.start.row:Infinity),c&&(this.$docRowCache.push(r),this.$screenRowCache.push(o))}if(p&&p.start.row<=r)n=this.getFoldDisplayLine(p),r=p.start.row;else{if(o+u<=e||r>h)return{row:h,column:this.getLine(h).length};n=this.getLine(r),p=null}var v=0;if(this.$useWrapMode){var m=this.$wrapData[r];if(m){var g=Math.floor(e-o);s=m[g],g>0&&m.length&&(v=m.indent,i=m[g-1]||m[m.length-1],n=n.substring(i))}}return i+=this.$getStringScreenWidth(n,t-v)[1],this.$useWrapMode&&i>=s&&(i=s-1),p?p.idxToPosition(i):{row:r,column:i}},this.documentToScreenPosition=function(e,t){if(typeof t=="undefined")var n=this.$clipPositionToDocument(e.row,e.column);else n=this.$clipPositionToDocument(e,t);e=n.row,t=n.column;var r=0,i=null,s=null;s=this.getFoldAt(e,t,1),s&&(e=s.start.row,t=s.start.column);var o,u=0,a=this.$docRowCache,f=this.$getRowCacheIndex(a,e),l=a.length;if(l&&f>=0)var u=a[f],r=this.$screenRowCache[f],c=e>a[l-1];else var c=!l;var h=this.getNextFoldLine(u),p=h?h.start.row:Infinity;while(u=p){o=h.end.row+1;if(o>e)break;h=this.getNextFoldLine(o,h),p=h?h.start.row:Infinity}else o=u+1;r+=this.getRowLength(u),u=o,c&&(this.$docRowCache.push(u),this.$screenRowCache.push(r))}var d="";h&&u>=p?(d=this.getFoldDisplayLine(h,e,t),i=h.start.row):(d=this.getLine(e).substring(0,t),i=e);var v=0;if(this.$useWrapMode){var m=this.$wrapData[i];if(m){var g=0;while(d.length>=m[g])r++,g++;d=d.substring(m[g-1]||0,d.length),v=g>0?m.indent:0}}return{row:r,column:v+this.$getStringScreenWidth(d)[0]}},this.documentToScreenColumn=function(e,t){return this.documentToScreenPosition(e,t).column},this.documentToScreenRow=function(e,t){return this.documentToScreenPosition(e,t).row},this.getScreenLength=function(){var e=0,t=null;if(!this.$useWrapMode){e=this.getLength();var n=this.$foldData;for(var r=0;ro&&(s=t.end.row+1,t=this.$foldData[r++],o=t?t.start.row:Infinity)}}return this.lineWidgets&&(e+=this.$getWidgetScreenLength()),e},this.$setFontMetrics=function(e){if(!this.$enableVarChar)return;this.$getStringScreenWidth=function(t,n,r){if(n===0)return[0,0];n||(n=Infinity),r=r||0;var i,s;for(s=0;sn)break}return[r,s]}},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(p.prototype),e("./edit_session/folding").Folding.call(p.prototype),e("./edit_session/bracket_match").BracketMatch.call(p.prototype),s.defineOptions(p.prototype,"session",{wrap:{set:function(e){!e||e=="off"?e=!1:e=="free"?e=!0:e=="printMargin"?e=-1:typeof e=="string"&&(e=parseInt(e,10)||!1);if(this.$wrap==e)return;this.$wrap=e;if(!e)this.setUseWrapMode(!1);else{var t=typeof e=="number"?e:null;this.setWrapLimitRange(t,t),this.setUseWrapMode(!0)}},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(e){e=e=="auto"?this.$mode.type!="text":e!="text",e!=this.$wrapAsCode&&(this.$wrapAsCode=e,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(e){this.$useWorker=e,this.$stopWorker(),e&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(e){if(isNaN(e)||this.$tabSize===e)return;this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=e,this._signal("changeTabSize")},initialValue:4,handlesSet:!0},overwrite:{set:function(e){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(e){this.doc.setNewLineMode(e)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(e){this.setMode(e)},get:function(){return this.$modeId}}}),t.EditSession=p}),ace.define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(e,t,n){"use strict";var r=e("./lib/lang"),i=e("./lib/oop"),s=e("./range").Range,o=function(){this.$options={}};(function(){this.set=function(e){return i.mixin(this.$options,e),this},this.getOptions=function(){return r.copyObject(this.$options)},this.setOptions=function(e){this.$options=e},this.find=function(e){var t=this.$options,n=this.$matchIterator(e,t);if(!n)return!1;var r=null;return n.forEach(function(e,n,i){if(!e.start){var o=e.offset+(i||0);r=new s(n,o,n,o+e.length);if(!e.length&&t.start&&t.start.start&&t.skipCurrent!=0&&r.isEqual(t.start))return r=null,!1}else r=e;return!0}),r},this.findAll=function(e){var t=this.$options;if(!t.needle)return[];this.$assembleRegExp(t);var n=t.range,i=n?e.getLines(n.start.row,n.end.row):e.doc.getAllLines(),o=[],u=t.re;if(t.$isMultiLine){var a=u.length,f=i.length-a,l;e:for(var c=u.offset||0;c<=f;c++){for(var h=0;hv)continue;o.push(l=new s(c,v,c+a-1,m)),a>2&&(c=c+a-2)}}else for(var g=0;gE&&o[h].end.row==n.end.row)h--;o=o.slice(g,h+1);for(g=0,h=o.length;g=0;u--)if(i(o[u],t,s))return!0};else var u=function(e,t,s){var o=r.getMatchOffsets(e,n);for(var u=0;u=o;r--)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=u,o=s.row;r>=o;r--)if(n(e.getLine(r),r))return}:function(n){var r=s.row,i=e.getLine(r).substr(s.column);if(n(i,r,s.column))return;for(r+=1;r<=u;r++)if(n(e.getLine(r),r))return;if(t.wrap==0)return;for(r=o,u=s.row;r<=u;r++)if(n(e.getLine(r),r))return};return{forEach:a}}}).call(o.prototype),t.Search=o}),ace.define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(e,t,n){"use strict";function o(e,t){this.platform=t||(i.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(e),this.$singleCommand=!0}function u(e,t){o.call(this,e,t),this.$singleCommand=!1}var r=e("../lib/keys"),i=e("../lib/useragent"),s=r.KEY_MODS;u.prototype=o.prototype,function(){function e(e){return typeof e=="object"&&e.bindKey&&e.bindKey.position||0}this.addCommand=function(e){this.commands[e.name]&&this.removeCommand(e),this.commands[e.name]=e,e.bindKey&&this._buildKeyHash(e)},this.removeCommand=function(e,t){var n=e&&(typeof e=="string"?e:e.name);e=this.commands[n],t||delete this.commands[n];var r=this.commandKeyBinding;for(var i in r){var s=r[i];if(s==e)delete r[i];else if(Array.isArray(s)){var o=s.indexOf(e);o!=-1&&(s.splice(o,1),s.length==1&&(r[i]=s[0]))}}},this.bindKey=function(e,t,n){typeof e=="object"&&e&&(n==undefined&&(n=e.position),e=e[this.platform]);if(!e)return;if(typeof t=="function")return this.addCommand({exec:t,bindKey:e,name:t.name||e});e.split("|").forEach(function(e){var r="";if(e.indexOf(" ")!=-1){var i=e.split(/\s+/);e=i.pop(),i.forEach(function(e){var t=this.parseKeys(e),n=s[t.hashId]+t.key;r+=(r?" ":"")+n,this._addCommandToBinding(r,"chainKeys")},this),r+=" "}var o=this.parseKeys(e),u=s[o.hashId]+o.key;this._addCommandToBinding(r+u,t,n)},this)},this._addCommandToBinding=function(t,n,r){var i=this.commandKeyBinding,s;if(!n)delete i[t];else if(!i[t]||this.$singleCommand)i[t]=n;else{Array.isArray(i[t])?(s=i[t].indexOf(n))!=-1&&i[t].splice(s,1):i[t]=[i[t]],typeof r!="number"&&(r||n.isDefault?r=-100:r=e(n));var o=i[t];for(s=0;sr)break}o.splice(s,0,n)}},this.addCommands=function(e){e&&Object.keys(e).forEach(function(t){var n=e[t];if(!n)return;if(typeof n=="string")return this.bindKey(n,t);typeof n=="function"&&(n={exec:n});if(typeof n!="object")return;n.name||(n.name=t),this.addCommand(n)},this)},this.removeCommands=function(e){Object.keys(e).forEach(function(t){this.removeCommand(e[t])},this)},this.bindKeys=function(e){Object.keys(e).forEach(function(t){this.bindKey(t,e[t])},this)},this._buildKeyHash=function(e){this.bindKey(e.bindKey,e)},this.parseKeys=function(e){var t=e.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(e){return e}),n=t.pop(),i=r[n];if(r.FUNCTION_KEYS[i])n=r.FUNCTION_KEYS[i].toLowerCase();else{if(!t.length)return{key:n,hashId:-1};if(t.length==1&&t[0]=="shift")return{key:n.toUpperCase(),hashId:-1}}var s=0;for(var o=t.length;o--;){var u=r.KEY_MODS[t[o]];if(u==null)return typeof console!="undefined"&&console.error("invalid modifier "+t[o]+" in "+e),!1;s|=u}return{key:n,hashId:s}},this.findKeyCommand=function(t,n){var r=s[t]+n;return this.commandKeyBinding[r]},this.handleKeyboard=function(e,t,n,r){if(r<0)return;var i=s[t]+n,o=this.commandKeyBinding[i];e.$keyChain&&(e.$keyChain+=" "+i,o=this.commandKeyBinding[e.$keyChain]||o);if(o)if(o=="chainKeys"||o[o.length-1]=="chainKeys")return e.$keyChain=e.$keyChain||i,{command:"null"};if(e.$keyChain)if(!!t&&t!=4||n.length!=1){if(t==-1||r>0)e.$keyChain=""}else e.$keyChain=e.$keyChain.slice(0,-i.length-1);return{command:o}},this.getStatusText=function(e,t){return t.$keyChain||""}}.call(o.prototype),t.HashHandler=o,t.MultiHashHandler=u}),ace.define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../keyboard/hash_handler").MultiHashHandler,s=e("../lib/event_emitter").EventEmitter,o=function(e,t){i.call(this,t,e),this.byName=this.commands,this.setDefaultHandler("exec",function(e){return e.command.exec(e.editor,e.args||{})})};r.inherits(o,i),function(){r.implement(this,s),this.exec=function(e,t,n){if(Array.isArray(e)){for(var r=e.length;r--;)if(this.exec(e[r],t,n))return!0;return!1}typeof e=="string"&&(e=this.commands[e]);if(!e)return!1;if(t&&t.$readOnly&&!e.readOnly)return!1;var i={editor:t,command:e,args:n};return i.returnValue=this._emit("exec",i),this._signal("afterExec",i),i.returnValue===!1?!1:!0},this.toggleRecording=function(e){if(this.$inReplay)return;return e&&e._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(e){this.macro.push([e.command,e.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(e){if(this.$inReplay||!this.macro)return;if(this.recording)return this.toggleRecording(e);try{this.$inReplay=!0,this.macro.forEach(function(t){typeof t=="string"?this.exec(t,e):this.exec(t[0],e,t[1])},this)}finally{this.$inReplay=!1}},this.trimMacro=function(e){return e.map(function(e){return typeof e[0]!="string"&&(e[0]=e[0].name),e[1]||(e=e[0]),e})}}.call(o.prototype),t.CommandManager=o}),ace.define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(e,t,n){"use strict";function o(e,t){return{win:e,mac:t}}var r=e("../lib/lang"),i=e("../config"),s=e("../range").Range;t.commands=[{name:"showSettingsMenu",bindKey:o("Ctrl-,","Command-,"),exec:function(e){i.loadModule("ace/ext/settings_menu",function(t){t.init(e),e.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:o("Alt-E","Ctrl-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:o("Alt-Shift-E","Ctrl-Shift-E"),exec:function(e){i.loadModule("ace/ext/error_marker",function(t){t.showErrorMarker(e,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:o("Ctrl-A","Command-A"),exec:function(e){e.selectAll()},readOnly:!0},{name:"centerselection",bindKey:o(null,"Ctrl-L"),exec:function(e){e.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:o("Ctrl-L","Command-L"),exec:function(e){var t=parseInt(prompt("Enter line number:"),10);isNaN(t)||e.gotoLine(t)},readOnly:!0},{name:"fold",bindKey:o("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(e){e.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:o("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(e){e.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:o("F2","F2"),exec:function(e){e.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:o("Alt-F2","Alt-F2"),exec:function(e){e.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:o(null,"Ctrl-Command-Option-0"),exec:function(e){e.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:o("Alt-0","Command-Option-0"),exec:function(e){e.session.foldAll(),e.session.unfold(e.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:o("Alt-Shift-0","Command-Option-Shift-0"),exec:function(e){e.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:o("Ctrl-K","Command-G"),exec:function(e){e.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:o("Ctrl-Shift-K","Command-Shift-G"),exec:function(e){e.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:o("Alt-K","Ctrl-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:o("Alt-Shift-K","Ctrl-Shift-G"),exec:function(e){e.selection.isEmpty()?e.selection.selectWord():e.findPrevious()},readOnly:!0},{name:"find",bindKey:o("Ctrl-F","Command-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(e){e.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:o("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(e){e.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:o("Ctrl-Home","Command-Home|Command-Up"),exec:function(e){e.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:o("Shift-Up","Shift-Up"),exec:function(e){e.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:o("Up","Up|Ctrl-P"),exec:function(e,t){e.navigateUp(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:o("Ctrl-Shift-End","Command-Shift-Down"),exec:function(e){e.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:o("Ctrl-End","Command-End|Command-Down"),exec:function(e){e.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:o("Shift-Down","Shift-Down"),exec:function(e){e.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:o("Down","Down|Ctrl-N"),exec:function(e,t){e.navigateDown(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:o("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(e){e.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:o("Ctrl-Left","Option-Left"),exec:function(e){e.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:o("Alt-Shift-Left","Command-Shift-Left"),exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:o("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(e){e.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:o("Shift-Left","Shift-Left"),exec:function(e){e.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:o("Left","Left|Ctrl-B"),exec:function(e,t){e.navigateLeft(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:o("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(e){e.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:o("Ctrl-Right","Option-Right"),exec:function(e){e.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:o("Alt-Shift-Right","Command-Shift-Right"),exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:o("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(e){e.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:o("Shift-Right","Shift-Right"),exec:function(e){e.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:o("Right","Right|Ctrl-F"),exec:function(e,t){e.navigateRight(t.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(e){e.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:o(null,"Option-PageDown"),exec:function(e){e.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:o("PageDown","PageDown|Ctrl-V"),exec:function(e){e.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(e){e.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:o(null,"Option-PageUp"),exec:function(e){e.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(e){e.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:o("Ctrl-Up",null),exec:function(e){e.renderer.scrollBy(0,-2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:o("Ctrl-Down",null),exec:function(e){e.renderer.scrollBy(0,2*e.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(e){e.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(e){e.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:o("Ctrl-Alt-E","Command-Option-E"),exec:function(e){e.commands.toggleRecording(e)},readOnly:!0},{name:"replaymacro",bindKey:o("Ctrl-Shift-E","Command-Shift-E"),exec:function(e){e.commands.replay(e)},readOnly:!0},{name:"jumptomatching",bindKey:o("Ctrl-P","Ctrl-P"),exec:function(e){e.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:o("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(e){e.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:o("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(e){e.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:o(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(e){},readOnly:!0},{name:"cut",exec:function(e){var t=e.getSelectionRange();e._emit("cut",t),e.selection.isEmpty()||(e.session.remove(t),e.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(e,t){e.$handlePaste(t)},scrollIntoView:"cursor"},{name:"removeline",bindKey:o("Ctrl-D","Command-D"),exec:function(e){e.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:o("Ctrl-Shift-D","Command-Shift-D"),exec:function(e){e.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:o("Ctrl-Alt-S","Command-Alt-S"),exec:function(e){e.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:o("Ctrl-/","Command-/"),exec:function(e){e.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:o("Ctrl-Shift-/","Command-Shift-/"),exec:function(e){e.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:o("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(e){e.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:o("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(e){e.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:o("Ctrl-H","Command-Option-F"),exec:function(e){i.loadModule("ace/ext/searchbox",function(t){t.Search(e,!0)})}},{name:"undo",bindKey:o("Ctrl-Z","Command-Z"),exec:function(e){e.undo()}},{name:"redo",bindKey:o("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(e){e.redo()}},{name:"copylinesup",bindKey:o("Alt-Shift-Up","Command-Option-Up"),exec:function(e){e.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:o("Alt-Up","Option-Up"),exec:function(e){e.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:o("Alt-Shift-Down","Command-Option-Down"),exec:function(e){e.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:o("Alt-Down","Option-Down"),exec:function(e){e.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:o("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(e){e.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:o("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(e){e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:o("Shift-Delete",null),exec:function(e){if(!e.selection.isEmpty())return!1;e.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:o("Alt-Backspace","Command-Backspace"),exec:function(e){e.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:o("Alt-Delete","Ctrl-K"),exec:function(e){e.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:o("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(e){e.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:o("Ctrl-Delete","Alt-Delete"),exec:function(e){e.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:o("Shift-Tab","Shift-Tab"),exec:function(e){e.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:o("Tab","Tab"),exec:function(e){e.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:o("Ctrl-[","Ctrl-["),exec:function(e){e.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:o("Ctrl-]","Ctrl-]"),exec:function(e){e.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(e,t){e.insert(t)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(e,t){e.insert(r.stringRepeat(t.text||"",t.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:o(null,"Ctrl-O"),exec:function(e){e.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:o("Ctrl-T","Ctrl-T"),exec:function(e){e.transposeLetters()},multiSelectAction:function(e){e.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:o("Ctrl-U","Ctrl-U"),exec:function(e){e.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:o("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(e){e.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:o("Ctrl-Shift-L","Command-Shift-L"),exec:function(e){var t=e.selection.getRange();t.start.column=t.end.column=0,t.end.row++,e.selection.setRange(t,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:o(null,null),exec:function(e){var t=e.selection.isBackwards(),n=t?e.selection.getSelectionLead():e.selection.getSelectionAnchor(),i=t?e.selection.getSelectionAnchor():e.selection.getSelectionLead(),o=e.session.doc.getLine(n.row).length,u=e.session.doc.getTextRange(e.selection.getRange()),a=u.replace(/\n\s*/," ").length,f=e.session.doc.getLine(n.row);for(var l=n.row+1;l<=i.row+1;l++){var c=r.stringTrimLeft(r.stringTrimRight(e.session.doc.getLine(l)));c.length!==0&&(c=" "+c),f+=c}i.row+10?(e.selection.moveCursorTo(n.row,n.column),e.selection.selectTo(n.row,n.column+a)):(o=e.session.doc.getLine(n.row).length>o?o+1:o,e.selection.moveCursorTo(n.row,o))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:o(null,null),exec:function(e){var t=e.session.doc.getLength()-1,n=e.session.doc.getLine(t).length,r=e.selection.rangeList.ranges,i=[];r.length<1&&(r=[e.selection.getRange()]);for(var o=0;o0&&this.$blockScrolling--;var n=t&&t.scrollIntoView;if(n){switch(n){case"center-animate":n="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var r=this.selection.getRange(),i=this.renderer.layerConfig;(r.start.row>=i.lastRow||r.end.row<=i.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead);break;default:}n=="animate"&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(e){if(!this.$mergeUndoDeltas)return;var t=this.prevOp,n=this.$mergeableCommands,r=t.command&&e.command.name==t.command.name;if(e.command.name=="insertstring"){var i=e.args;this.mergeNextCommand===undefined&&(this.mergeNextCommand=!0),r=r&&this.mergeNextCommand&&(!/\s/.test(i)||/\s/.test(t.args)),this.mergeNextCommand=!0}else r=r&&n.indexOf(e.command.name)!==-1;this.$mergeUndoDeltas!="always"&&Date.now()-this.sequenceStartTime>2e3&&(r=!1),r?this.session.mergeUndoDeltas=!0:n.indexOf(e.command.name)!==-1&&(this.sequenceStartTime=Date.now())},this.setKeyboardHandler=function(e,t){if(e&&typeof e=="string"){this.$keybindingId=e;var n=this;g.loadModule(["keybinding",e],function(r){n.$keybindingId==e&&n.keyBinding.setKeyboardHandler(r&&r.handler),t&&t()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(e),t&&t()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(e){if(this.session==e)return;this.curOp&&this.endOperation(),this.curOp={};var t=this.session;if(t){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var n=this.session.getSelection();n.off("changeCursor",this.$onCursorChange),n.off("changeSelection",this.$onSelectionChange)}this.session=e,e?(this.$onDocumentChange=this.onDocumentChange.bind(this),e.on("change",this.$onDocumentChange),this.renderer.setSession(e),this.$onChangeMode=this.onChangeMode.bind(this),e.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),e.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),e.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),e.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),e.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),e.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=e.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(e)),this._signal("changeSession",{session:e,oldSession:t}),this.curOp=null,t&&t._signal("changeEditor",{oldEditor:this}),e&&e._signal("changeEditor",{editor:this})},this.getSession=function(){return this.session},this.setValue=function(e,t){return this.session.doc.setValue(e),t?t==1?this.navigateFileEnd():t==-1&&this.navigateFileStart():this.selectAll(),e},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(e){this.renderer.onResize(e)},this.setTheme=function(e,t){this.renderer.setTheme(e,t)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(e){this.renderer.setStyle(e)},this.unsetStyle=function(e){this.renderer.unsetStyle(e)},this.getFontSize=function(){return this.getOption("fontSize")||i.computedStyle(this.container,"fontSize")},this.setFontSize=function(e){this.setOption("fontSize",e)},this.$highlightBrackets=function(){this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null);if(this.$highlightPending)return;var e=this;this.$highlightPending=!0,setTimeout(function(){e.$highlightPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=t.findMatchingBracket(e.getCursorPosition());if(n)var r=new p(n.row,n.column,n.row,n.column+1);else if(t.$mode.getMatching)var r=t.$mode.getMatching(e.session);r&&(t.$bracketHighlight=t.addMarker(r,"ace_bracket","text"))},50)},this.$highlightTags=function(){if(this.$highlightTagPending)return;var e=this;this.$highlightTagPending=!0,setTimeout(function(){e.$highlightTagPending=!1;var t=e.session;if(!t||!t.bgTokenizer)return;var n=e.getCursorPosition(),r=new y(e.session,n.row,n.column),i=r.getCurrentToken();if(!i||!/\b(?:tag-open|tag-name)/.test(i.type)){t.removeMarker(t.$tagHighlight),t.$tagHighlight=null;return}if(i.type.indexOf("tag-open")!=-1){i=r.stepForward();if(!i)return}var s=i.value,o=0,u=r.stepBackward();if(u.value=="<"){do u=i,i=r.stepForward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="=0)}else{do i=u,u=r.stepBackward(),i&&i.value===s&&i.type.indexOf("tag-name")!==-1&&(u.value==="<"?o++:u.value==="1)&&(t=!1)}if(e.$highlightLineMarker&&!t)e.removeMarker(e.$highlightLineMarker.id),e.$highlightLineMarker=null;else if(!e.$highlightLineMarker&&t){var n=new p(t.row,t.column,t.row,Infinity);n.id=e.addMarker(n,"ace_active-line","screenLine"),e.$highlightLineMarker=n}else t&&(e.$highlightLineMarker.start.row=t.row,e.$highlightLineMarker.end.row=t.row,e.$highlightLineMarker.start.column=t.column,e._signal("changeBackMarker"))},this.onSelectionChange=function(e){var t=this.session;t.$selectionMarker&&t.removeMarker(t.$selectionMarker),t.$selectionMarker=null;if(!this.selection.isEmpty()){var n=this.selection.getRange(),r=this.getSelectionStyle();t.$selectionMarker=t.addMarker(n,"ace_selection",r)}else this.$updateHighlightActiveLine();var i=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(i),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var e=this.session,t=this.getSelectionRange();if(t.isEmpty()||t.isMultiLine())return;var n=t.start.column-1,r=t.end.column+1,i=e.getLine(t.start.row),s=i.length,o=i.substring(Math.max(n,0),Math.min(r,s));if(n>=0&&/^[\w\d]/.test(o)||r<=s&&/[\w\d]$/.test(o))return;o=i.substring(t.start.column,t.end.column);if(!/^[\w\d]+$/.test(o))return;var u=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:o});return u},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(e){this.renderer.updateText(),this._emit("changeMode",e)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var e=this.getSelectedText();return this._signal("copy",e),e},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(e,t){var n={text:e,event:t};this.commands.exec("paste",this,n)},this.$handlePaste=function(e){typeof e=="string"&&(e={text:e}),this._signal("paste",e);var t=e.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(t);else{var n=t.split(/\r\n|\r|\n/),r=this.selection.rangeList.ranges;if(n.length>r.length||n.length<2||!n[1])return this.commands.exec("insertstring",this,t);for(var i=r.length;i--;){var s=r[i];s.isEmpty()||this.session.remove(s),this.session.insert(s.start,n[i])}}},this.execCommand=function(e,t){return this.commands.exec(e,this,t)},this.insert=function(e,t){var n=this.session,r=n.getMode(),i=this.getCursorPosition();if(this.getBehavioursEnabled()&&!t){var s=r.transformAction(n.getState(i.row),"insertion",this,n,e);s&&(e!==s.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),e=s.text)}e==" "&&(e=this.session.getTabString());if(!this.selection.isEmpty()){var o=this.getSelectionRange();i=this.session.remove(o),this.clearSelection()}else if(this.session.getOverwrite()){var o=new p.fromPoints(i,i);o.end.column+=e.length,this.session.remove(o)}if(e=="\n"||e=="\r\n"){var u=n.getLine(i.row);if(i.column>u.search(/\S|$/)){var a=u.substr(i.column).search(/\S|$/);n.doc.removeInLine(i.row,i.column,i.column+a)}}this.clearSelection();var f=i.column,l=n.getState(i.row),u=n.getLine(i.row),c=r.checkOutdent(l,u,e),h=n.insert(i,e);s&&s.selection&&(s.selection.length==2?this.selection.setSelectionRange(new p(i.row,f+s.selection[0],i.row,f+s.selection[1])):this.selection.setSelectionRange(new p(i.row+s.selection[0],s.selection[1],i.row+s.selection[2],s.selection[3])));if(n.getDocument().isNewLine(e)){var d=r.getNextLineIndent(l,u.slice(0,i.column),n.getTabString());n.insert({row:i.row+1,column:0},d)}c&&r.autoOutdent(l,n,i.row)},this.onTextInput=function(e){this.keyBinding.onTextInput(e)},this.onCommandKey=function(e,t,n){this.keyBinding.onCommandKey(e,t,n)},this.setOverwrite=function(e){this.session.setOverwrite(e)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(e){this.setOption("scrollSpeed",e)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(e){this.setOption("dragDelay",e)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(e){this.setOption("selectionStyle",e)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(e){this.setOption("highlightActiveLine",e)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(e){this.setOption("highlightSelectedWord",e)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(e){this.renderer.setAnimatedScroll(e)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(e){this.renderer.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(e){this.renderer.setDisplayIndentGuides(e)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(e){this.renderer.setShowPrintMargin(e)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(e){this.renderer.setPrintMarginColumn(e)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(e){this.setOption("readOnly",e)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(e){this.setOption("behavioursEnabled",e)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(e){this.setOption("wrapBehavioursEnabled",e)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(e){this.setOption("showFoldWidgets",e)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(e){this.selection.isEmpty()&&(e=="left"?this.selection.selectLeft():this.selection.selectRight());var t=this.getSelectionRange();if(this.getBehavioursEnabled()){var n=this.session,r=n.getState(t.start.row),i=n.getMode().transformAction(r,"deletion",this,n,t);if(t.end.column===0){var s=n.getTextRange(t);if(s[s.length-1]=="\n"){var o=n.getLine(t.end.row);/^\s+$/.test(o)&&(t.end.column=o.length)}}i&&(t=i)}this.session.remove(t),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var e=this.getSelectionRange();e.start.column==e.end.column&&e.start.row==e.end.row&&(e.end.column=0,e.end.row++),this.session.remove(e),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var e=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(e)},this.transposeLetters=function(){if(!this.selection.isEmpty())return;var e=this.getCursorPosition(),t=e.column;if(t===0)return;var n=this.session.getLine(e.row),r,i;tt.toLowerCase()?1:0});var r=new p(0,0,0,0);for(var i=e.first;i<=e.last;i++){var s=t.getLine(i);r.start.row=i,r.end.row=i,r.end.column=s.length,t.replace(r,n[i-e.first])}},this.toggleCommentLines=function(){var e=this.session.getState(this.getCursorPosition().row),t=this.$getSelectedRows();this.session.getMode().toggleCommentLines(e,this.session,t.first,t.last)},this.toggleBlockComment=function(){var e=this.getCursorPosition(),t=this.session.getState(e.row),n=this.getSelectionRange();this.session.getMode().toggleBlockComment(t,this.session,n,e)},this.getNumberAt=function(e,t){var n=/[\-]?[0-9]+(?:\.[0-9]+)?/g;n.lastIndex=0;var r=this.session.getLine(e);while(n.lastIndex=t){var s={value:i[0],start:i.index,end:i.index+i[0].length};return s}}return null},this.modifyNumber=function(e){var t=this.selection.getCursor().row,n=this.selection.getCursor().column,r=new p(t,n-1,t,n),i=this.session.getTextRange(r);if(!isNaN(parseFloat(i))&&isFinite(i)){var s=this.getNumberAt(t,n);if(s){var o=s.value.indexOf(".")>=0?s.start+s.value.indexOf(".")+1:s.end,u=s.start+s.value.length-o,a=parseFloat(s.value);a*=Math.pow(10,u),o!==s.end&&np+1)break;p=d.last}l--,u=this.session.$moveLines(h,p,t?0:e),t&&e==-1&&(c=l+1);while(c<=l)o[c].moveBy(u,0),c++;t||(u=0),a+=u}i.fromOrientedRange(i.ranges[0]),i.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(e){return e=(e||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(e.start.row),last:this.session.getRowFoldEnd(e.end.row)}},this.onCompositionStart=function(e){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(e){this.renderer.setCompositionText(e)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(e){return e>=this.getFirstVisibleRow()&&e<=this.getLastVisibleRow()},this.isRowFullyVisible=function(e){return e>=this.renderer.getFirstFullyVisibleRow()&&e<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(e,t){var n=this.renderer,r=this.renderer.layerConfig,i=e*Math.floor(r.height/r.lineHeight);this.$blockScrolling++,t===!0?this.selection.$moveSelection(function(){this.moveCursorBy(i,0)}):t===!1&&(this.selection.moveCursorBy(i,0),this.selection.clearSelection()),this.$blockScrolling--;var s=n.scrollTop;n.scrollBy(0,i*r.lineHeight),t!=null&&n.scrollCursorIntoView(null,.5),n.animateScrolling(s)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(e){this.renderer.scrollToRow(e)},this.scrollToLine=function(e,t,n,r){this.renderer.scrollToLine(e,t,n,r)},this.centerSelection=function(){var e=this.getSelectionRange(),t={row:Math.floor(e.start.row+(e.end.row-e.start.row)/2),column:Math.floor(e.start.column+(e.end.column-e.start.column)/2)};this.renderer.alignCursor(t,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(e,t){this.selection.moveCursorTo(e,t)},this.moveCursorToPosition=function(e){this.selection.moveCursorToPosition(e)},this.jumpToMatching=function(e,t){var n=this.getCursorPosition(),r=new y(this.session,n.row,n.column),i=r.getCurrentToken(),s=i||r.stepForward();if(!s)return;var o,u=!1,a={},f=n.column-s.start,l,c={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(s.value.match(/[{}()\[\]]/g))for(;f=0;--s)this.$tryReplace(n[s],e)&&r++;return this.selection.setSelectionRange(i),this.$blockScrolling-=1,r},this.$tryReplace=function(e,t){var n=this.session.getTextRange(e);return t=this.$search.replace(n,t),t!==null?(e.end=this.session.replace(e,t),e):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(e,t,n){t||(t={}),typeof e=="string"||e instanceof RegExp?t.needle=e:typeof e=="object"&&r.mixin(t,e);var i=this.selection.getRange();t.needle==null&&(e=this.session.getTextRange(i)||this.$search.$options.needle,e||(i=this.session.getWordRange(i.start.row,i.start.column),e=this.session.getTextRange(i)),this.$search.set({needle:e})),this.$search.set(t),t.start||this.$search.set({start:i});var s=this.$search.find(this.session);if(t.preventScroll)return s;if(s)return this.revealRange(s,n),s;t.backwards?i.start=i.end:i.end=i.start,this.selection.setRange(i)},this.findNext=function(e,t){this.find({skipCurrent:!0,backwards:!1},e,t)},this.findPrevious=function(e,t){this.find(e,{skipCurrent:!0,backwards:!0},t)},this.revealRange=function(e,t){this.$blockScrolling+=1,this.session.unfold(e),this.selection.setSelectionRange(e),this.$blockScrolling-=1;var n=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(e.start,e.end,.5),t!==!1&&this.renderer.animateScrolling(n)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(e){if(!e)return;var t,n=this,r=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var i=this.$scrollAnchor;i.style.cssText="position:absolute",this.container.insertBefore(i,this.container.firstChild);var s=this.on("changeSelection",function(){r=!0}),o=this.renderer.on("beforeRender",function(){r&&(t=n.renderer.container.getBoundingClientRect())}),u=this.renderer.on("afterRender",function(){if(r&&t&&(n.isFocused()||n.searchBox&&n.searchBox.isFocused())){var e=n.renderer,s=e.$cursorLayer.$pixelPos,o=e.layerConfig,u=s.top-o.offset;s.top>=0&&u+t.top<0?r=!0:s.topwindow.innerHeight?r=!1:r=null,r!=null&&(i.style.top=u+"px",i.style.left=s.left+"px",i.style.height=o.lineHeight+"px",i.scrollIntoView(r)),r=t=null}});this.setAutoScrollEditorIntoView=function(e){if(e)return;delete this.setAutoScrollEditorIntoView,this.off("changeSelection",s),this.renderer.off("afterRender",u),this.renderer.off("beforeRender",o)}},this.$resetCursorStyle=function(){var e=this.$cursorStyle||"ace",t=this.renderer.$cursorLayer;if(!t)return;t.setSmoothBlinking(/smooth/.test(e)),t.isBlinking=!this.$readOnly&&e!="wide",i.setCssClass(t.element,"ace_slim-cursors",/slim/.test(e))}}).call(b.prototype),g.defineOptions(b.prototype,"editor",{selectionStyle:{set:function(e){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:e})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(e){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(e){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(e){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(e){this.setAutoScrollEditorIntoView(e)}},keyboardHandler:{set:function(e){this.setKeyboardHandler(e)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),t.Editor=b}),ace.define("ace/undomanager",["require","exports","module"],function(e,t,n){"use strict";var r=function(){this.reset()};(function(){function e(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines.length==1?null:e.lines,text:e.lines.length==1?e.lines[0]:null}}function t(e){return{action:e.action,start:e.start,end:e.end,lines:e.lines||[e.text]}}function n(e,t){var n=new Array(e.length);for(var r=0;r0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return this.dirtyCounter===0},this.$serializeDeltas=function(t){return n(t,e)},this.$deserializeDeltas=function(e){return n(e,t)}}).call(r.prototype),t.UndoManager=r}),ace.define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/dom"),i=e("../lib/oop"),s=e("../lib/lang"),o=e("../lib/event_emitter").EventEmitter,u=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_gutter-layer",e.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){i.implement(this,o),this.setSession=function(e){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=e,e&&e.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(e,t)},this.removeGutterDecoration=function(e,t){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(e,t)},this.setAnnotations=function(e){this.$annotations=[];for(var t=0;to&&(v=s.end.row+1,s=t.getNextFoldLine(v,s),o=s?s.start.row:Infinity);if(v>i){while(this.$cells.length>d+1)p=this.$cells.pop(),this.element.removeChild(p.element);break}p=this.$cells[++d],p||(p={element:null,textNode:null,foldWidget:null},p.element=r.createElement("div"),p.textNode=document.createTextNode(""),p.element.appendChild(p.textNode),this.element.appendChild(p.element),this.$cells[d]=p);var m="ace_gutter-cell ";a[v]&&(m+=a[v]),f[v]&&(m+=f[v]),this.$annotations[v]&&(m+=this.$annotations[v].className),p.element.className!=m&&(p.element.className=m);var g=t.getRowLength(v)*e.lineHeight+"px";g!=p.element.style.height&&(p.element.style.height=g);if(u){var y=u[v];y==null&&(y=u[v]=t.getFoldWidget(v))}if(y){p.foldWidget||(p.foldWidget=r.createElement("span"),p.element.appendChild(p.foldWidget));var m="ace_fold-widget ace_"+y;y=="start"&&v==o&&vn.right-t.right)return"foldWidgets"}}).call(u.prototype),t.Gutter=u}),ace.define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../range").Range,i=e("../lib/dom"),s=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_marker-layer",e.appendChild(this.element)};(function(){function e(e,t,n,r){return(e?1:0)|(t?2:0)|(n?4:0)|(r?8:0)}this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setMarkers=function(e){this.markers=e},this.update=function(e){var e=e||this.config;if(!e)return;this.config=e;var t=[];for(var n in this.markers){var r=this.markers[n];if(!r.range){r.update(t,this,this.session,e);continue}var i=r.range.clipRows(e.firstRow,e.lastRow);if(i.isEmpty())continue;i=i.toScreenRange(this.session);if(r.renderer){var s=this.$getTop(i.start.row,e),o=this.$padding+i.start.column*e.characterWidth;r.renderer(t,i,o,s,e)}else r.type=="fullLine"?this.drawFullLineMarker(t,i,r.clazz,e):r.type=="screenLine"?this.drawScreenLineMarker(t,i,r.clazz,e):i.isMultiLine()?r.type=="text"?this.drawTextMarker(t,i,r.clazz,e):this.drawMultiLineMarker(t,i,r.clazz,e):this.drawSingleLineMarker(t,i,r.clazz+" ace_start"+" ace_br15",e)}this.element.innerHTML=t.join("")},this.$getTop=function(e,t){return(e-t.firstRowScreen)*t.lineHeight},this.drawTextMarker=function(t,n,i,s,o){var u=this.session,a=n.start.row,f=n.end.row,l=a,c=0,h=0,p=u.getScreenLastRowColumn(l),d=new r(l,n.start.column,l,h);for(;l<=f;l++)d.start.row=d.end.row=l,d.start.column=l==a?n.start.column:u.getRowWrapIndent(l),d.end.column=p,c=h,h=p,p=l+1p,l==f),s,l==f?0:1,o)},this.drawMultiLineMarker=function(e,t,n,r,i){var s=this.$padding,o=r.lineHeight,u=this.$getTop(t.start.row,r),a=s+t.start.column*r.characterWidth;i=i||"",e.push("
      "),u=this.$getTop(t.end.row,r);var f=t.end.column*r.characterWidth;e.push("
      "),o=(t.end.row-t.start.row-1)*r.lineHeight;if(o<=0)return;u=this.$getTop(t.start.row+1,r);var l=(t.start.column?1:0)|(t.end.column?0:8);e.push("
      ")},this.drawSingleLineMarker=function(e,t,n,r,i,s){var o=r.lineHeight,u=(t.end.column+(i||0)-t.start.column)*r.characterWidth,a=this.$getTop(t.start.row,r),f=this.$padding+t.start.column*r.characterWidth;e.push("
      ")},this.drawFullLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;t.start.row!=t.end.row&&(o+=this.$getTop(t.end.row,r)-s),e.push("
      ")},this.drawScreenLineMarker=function(e,t,n,r,i){var s=this.$getTop(t.start.row,r),o=r.lineHeight;e.push("
      ")}}).call(s.prototype),t.Marker=s}),ace.define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=function(e){this.element=i.createElement("div"),this.element.className="ace_layer ace_text-layer",e.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){r.implement(this,u),this.EOF_CHAR="\u00b6",this.EOL_CHAR_LF="\u00ac",this.EOL_CHAR_CRLF="\u00a4",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="\u2014",this.SPACE_CHAR="\u00b7",this.$padding=0,this.$updateEolChar=function(){var e=this.session.doc.getNewLineCharacter()=="\n"?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=e)return this.EOL_CHAR=e,!0},this.setPadding=function(e){this.$padding=e,this.element.style.padding="0 "+e+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(e){this.$fontMetrics=e,this.$fontMetrics.on("changeCharacterSize",function(e){this._signal("changeCharacterSize",e)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(e){this.session=e,e&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(e){return this.showInvisibles==e?!1:(this.showInvisibles=e,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(e){return this.displayIndentGuides==e?!1:(this.displayIndentGuides=e,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var e=this.session.getTabSize();this.tabSize=e;var t=this.$tabStrings=[0];for(var n=1;n"+s.stringRepeat(this.TAB_CHAR,n)+""):t.push(s.stringRepeat(" ",n));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var r="ace_indent-guide",i="",o="";if(this.showInvisibles){r+=" ace_invisible",i=" ace_invisible_space",o=" ace_invisible_tab";var u=s.stringRepeat(this.SPACE_CHAR,this.tabSize),a=s.stringRepeat(this.TAB_CHAR,this.tabSize)}else var u=s.stringRepeat(" ",this.tabSize),a=u;this.$tabStrings[" "]=""+u+"",this.$tabStrings[" "]=""+a+""}},this.updateLines=function(e,t,n){(this.config.lastRow!=e.lastRow||this.config.firstRow!=e.firstRow)&&this.scrollLines(e),this.config=e;var r=Math.max(t,e.firstRow),i=Math.min(n,e.lastRow),s=this.element.childNodes,o=0;for(var u=e.firstRow;uf&&(u=a.end.row+1,a=this.session.getNextFoldLine(u,a),f=a?a.start.row:Infinity);if(u>i)break;var l=s[o++];if(l){var c=[];this.$renderLine(c,u,!this.$useLineGroups(),u==f?a:!1),l.style.height=e.lineHeight*this.session.getRowLength(u)+"px",l.innerHTML=c.join("")}u++}},this.scrollLines=function(e){var t=this.config;this.config=e;if(!t||t.lastRow0;r--)n.removeChild(n.firstChild);if(t.lastRow>e.lastRow)for(var r=this.session.getFoldedRowCount(e.lastRow+1,t.lastRow);r>0;r--)n.removeChild(n.lastChild);if(e.firstRowt.lastRow){var i=this.$renderLinesFragment(e,t.lastRow+1,e.lastRow);n.appendChild(i)}},this.$renderLinesFragment=function(e,t,n){var r=this.element.ownerDocument.createDocumentFragment(),s=t,o=this.session.getNextFoldLine(s),u=o?o.start.row:Infinity;for(;;){s>u&&(s=o.end.row+1,o=this.session.getNextFoldLine(s,o),u=o?o.start.row:Infinity);if(s>n)break;var a=i.createElement("div"),f=[];this.$renderLine(f,s,!1,s==u?o:!1),a.innerHTML=f.join("");if(this.$useLineGroups())a.className="ace_line_group",r.appendChild(a),a.style.height=e.lineHeight*this.session.getRowLength(s)+"px";else while(a.firstChild)r.appendChild(a.firstChild);s++}return r},this.update=function(e){this.config=e;var t=[],n=e.firstRow,r=e.lastRow,i=n,s=this.session.getNextFoldLine(i),o=s?s.start.row:Infinity;for(;;){i>o&&(i=s.end.row+1,s=this.session.getNextFoldLine(i,s),o=s?s.start.row:Infinity);if(i>r)break;this.$useLineGroups()&&t.push("
      "),this.$renderLine(t,i,!1,i==o?s:!1),this.$useLineGroups()&&t.push("
      "),i++}this.element.innerHTML=t.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(e,t,n,r){var i=this,o=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,u=function(e,n,r,o,u){if(n)return i.showInvisibles?""+s.stringRepeat(i.SPACE_CHAR,e.length)+"":e;if(e=="&")return"&";if(e=="<")return"<";if(e==">")return">";if(e==" "){var a=i.session.getScreenTabSize(t+o);return t+=a-1,i.$tabStrings[a]}if(e=="\u3000"){var f=i.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",l=i.showInvisibles?i.SPACE_CHAR:"";return t+=1,""+l+""}return r?""+i.SPACE_CHAR+"":(t+=1,""+e+"")},a=r.replace(o,u);if(!this.$textToken[n.type]){var f="ace_"+n.type.replace(/\./g," ace_"),l="";n.type=="fold"&&(l=" style='width:"+n.value.length*this.config.characterWidth+"px;' "),e.push("",a,"")}else e.push(a);return t+r.length},this.renderIndentGuide=function(e,t,n){var r=t.search(this.$indentGuideRe);return r<=0||r>=n?t:t[0]==" "?(r-=r%this.tabSize,e.push(s.stringRepeat(this.$tabStrings[" "],r/this.tabSize)),t.substr(r)):t[0]==" "?(e.push(s.stringRepeat(this.$tabStrings[" "],r)),t.substr(r)):t},this.$renderWrappedLine=function(e,t,n,r){var i=0,o=0,u=n[0],a=0;for(var f=0;f=u)a=this.$renderToken(e,a,l,c.substring(0,u-i)),c=c.substring(u-i),i=u,r||e.push("
      ","
      "),e.push(s.stringRepeat("\u00a0",n.indent)),o++,a=0,u=n[o]||Number.MAX_VALUE;c.length!=0&&(i+=c.length,a=this.$renderToken(e,a,l,c))}}},this.$renderSimpleLine=function(e,t){var n=0,r=t[0],i=r.value;this.displayIndentGuides&&(i=this.renderIndentGuide(e,i)),i&&(n=this.$renderToken(e,n,r,i));for(var s=1;s");if(i.length){var s=this.session.getRowSplitData(t);s&&s.length?this.$renderWrappedLine(e,i,s,n):this.$renderSimpleLine(e,i)}this.showInvisibles&&(r&&(t=r.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),n||e.push("
      ")},this.$getFoldLineTokens=function(e,t){function i(e,t,n){var i=0,s=0;while(s+e[i].value.lengthn-t&&(o=o.substring(0,n-t)),r.push({type:e[i].type,value:o}),s=t+o.length,i+=1}while(sn?r.push({type:e[i].type,value:o.substring(0,n-s)}):r.push(e[i]),s+=o.length,i+=1}}var n=this.session,r=[],s=n.getTokens(e);return t.walk(function(e,t,o,u,a){e!=null?r.push({type:"fold",value:e}):(a&&(s=n.getTokens(t)),s.length&&i(s,u,o))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";var r=e("../lib/dom"),i,s=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),i===undefined&&(i=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(i?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){var t=this.cursors;for(var n=t.length;n--;)t[n].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e!=this.smoothBlinking&&!i&&(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0);if(!this.isBlinking||!this.blinkInterval||!this.isVisible)return;this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var n=this.session.documentToScreenPosition(e),r=this.$padding+n.column*this.config.characterWidth,i=(n.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:r,top:i}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,n=0,r=0;if(t===undefined||t.length===0)t=[{cursor:null}];for(var n=0,i=t.length;ne.height+e.offset||s.top<0)&&n>1)continue;var o=(this.cursors[r++]||this.addCursor()).style;this.drawCursor?this.drawCursor(o,s,e,t[n],this.session):(o.left=s.left+"px",o.top=s.top+"px",o.width=e.characterWidth+"px",o.height=e.lineHeight+"px")}while(this.cursors.length>r)this.removeCursor();var u=this.session.getOverwrite();this.$setOverwrite(u),this.$pixelPos=s,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(s.prototype),t.Cursor=s}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./lib/event"),o=e("./lib/event_emitter").EventEmitter,u=function(e){this.element=i.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=i.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,s.addListener(this.element,"scroll",this.onScroll.bind(this)),s.addListener(this.element,"mousedown",s.preventDefault)};(function(){r.implement(this,o),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e}}).call(u.prototype);var a=function(e,t){u.call(this,e),this.scrollTop=0,t.$scrollbarWidth=this.width=i.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};r.inherits(a,u),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=function(e){this.inner.style.height=e+"px"},this.setScrollHeight=function(e){this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=e)}}.call(a.prototype);var f=function(e,t){u.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};r.inherits(f,u),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(f.prototype),t.ScrollBar=a,t.ScrollBarV=a,t.ScrollBarH=f,t.VScrollBar=a,t.HScrollBar=f}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,n){"use strict";var r=e("./lib/event"),i=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){this.changes=this.changes|e;if(!this.pending&&this.changes){this.pending=!0;var t=this;r.nextFrame(function(){t.pending=!1;var e;while(e=t.changes)t.changes=0,t.onRender(e)},this.window)}}}).call(i.prototype),t.RenderLoop=i}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,n){var r=e("../lib/oop"),i=e("../lib/dom"),s=e("../lib/lang"),o=e("../lib/useragent"),u=e("../lib/event_emitter").EventEmitter,a=0,f=t.FontMetrics=function(e){this.el=i.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=i.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=i.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),a||this.$testFractionalRect(),this.$measureNode.innerHTML=s.stringRepeat("X",a),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){r.implement(this,u),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=i.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;t>0&&t<1?a=50:a=100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",o.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(a===50){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var n={height:e.height,width:e.width/a}}else var n={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/a};return n.width===0||n.height===0?null:n},this.$measureCharWidth=function(e){this.$main.innerHTML=s.stringRepeat(e,a);var t=this.$main.getBoundingClientRect();return t.width/a},this.getCharacterWidth=function(e){var t=this.charSizes[e];return t===undefined&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(f.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./config"),o=e("./lib/useragent"),u=e("./layer/gutter").Gutter,a=e("./layer/marker").Marker,f=e("./layer/text").Text,l=e("./layer/cursor").Cursor,c=e("./scrollbar").HScrollBar,h=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,d=e("./layer/font_metrics").FontMetrics,v=e("./lib/event_emitter").EventEmitter,m='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';i.importCssString(m,"ace_editor.css");var g=function(e,t){var n=this;this.container=e||i.createElement("div"),this.$keepTextAreaAtCursor=!o.isOldIE,i.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=i.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=i.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=i.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new u(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new a(this.content);var r=this.$textLayer=new f(this.content);this.canvas=r.element,this.$markerFront=new a(this.content),this.$cursorLayer=new l(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new h(this.container,this),this.scrollBarH=new c(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollTop(e.data-n.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){n.$scrollAnimation||n.session.setScrollLeft(e.data-n.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new d(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){n.updateCharacterSize(),n.onResize(!0,n.gutterWidth,n.$size.width,n.$size.height),n._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),s.resetOptions(this),s._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,r.implement(this,v),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e);if(!e)return;this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode)},this.updateLines=function(e,t,n){t===undefined&&(t=Infinity),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow)return;this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,n,r){if(this.resizing>2)return;this.resizing>0?this.resizing++:this.resizing=e?1:0;var i=this.container;r||(r=i.clientHeight||i.scrollHeight),n||(n=i.clientWidth||i.scrollWidth);var s=this.$updateCachedSize(e,t,n,r);if(!this.$size.scrollerHeight||!n&&!r)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(s|this.$changes,!0):this.$loop.schedule(s|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null},this.$updateCachedSize=function(e,t,n,r){r-=this.$extraHeight||0;var i=0,s=this.$size,o={width:s.width,height:s.height,scrollerHeight:s.scrollerHeight,scrollerWidth:s.scrollerWidth};r&&(e||s.height!=r)&&(s.height=r,i|=this.CHANGE_SIZE,s.scrollerHeight=s.height,this.$horizScroll&&(s.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",i|=this.CHANGE_SCROLL);if(n&&(e||s.width!=n)){i|=this.CHANGE_SIZE,s.width=n,t==null&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",s.scrollerWidth=Math.max(0,n-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px";if(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)i|=this.CHANGE_FULL}return s.$dirty=!n||!r,i&&this._signal("resize",o),i},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-this.$padding*2,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var n=this.session.selection.getCursor();n.column=0,e=this.$cursorLayer.getPixelPosition(n,!0),t*=this.session.getRowLength(n.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(!this.$showPrintMargin&&!this.$printMarginEl)return;if(!this.$printMarginEl){var e=i.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=i.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(!this.$keepTextAreaAtCursor)return;var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,n=this.$cursorLayer.$pixelPos.left;t-=e.offset;var r=this.textarea.style,i=this.lineHeight;if(t<0||t>e.height-i){r.top=r.left="0";return}var s=this.characterWidth;if(this.$composition){var o=this.textarea.value.replace(/^\x01+/,"");s*=this.session.$getStringScreenWidth(o)[0]+2,i+=2}n-=this.scrollLeft,n>this.$size.scrollerWidth-s&&(n=this.$size.scrollerWidth-s),n+=this.gutterWidth,r.height=i+"px",r.width=s+"px",r.left=Math.min(n,this.$size.scrollerWidth-s)+"px",r.top=Math.min(t,this.$size.height-i)+"px"},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(this.layerConfig.offset===0?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow,n=this.session.documentToScreenRow(t,0)*e.lineHeight;return n-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,n,r){var i=this.scrollMargin;i.top=e|0,i.bottom=t|0,i.right=r|0,i.left=n|0,i.v=i.top+i.bottom,i.h=i.left+i.right,i.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-i.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){this.$changes&&(e|=this.$changes,this.$changes=0);if(!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t){this.$changes|=e;return}if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var n=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){e|=this.$computeLayerConfig();if(n.firstRow!=this.layerConfig.firstRow&&n.firstRowScreen==this.layerConfig.firstRowScreen){var r=this.scrollTop+(n.firstRow-this.layerConfig.firstRow)*this.lineHeight;r>0&&(this.scrollTop=r,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}n=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-n.offset+"px",this.content.style.marginTop=-n.offset+"px",this.content.style.width=n.width+2*this.$padding+"px",this.content.style.height=n.minHeight+"px"}e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left");if(e&this.CHANGE_FULL){this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this._signal("afterRender");return}if(e&this.CHANGE_SCROLL){e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(n):this.$textLayer.scrollLines(n),this.$showGutter&&this.$gutterLayer.update(n),this.$markerBack.update(n),this.$markerFront.update(n),this.$cursorLayer.update(n),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),this._signal("afterRender");return}e&this.CHANGE_TEXT?(this.$textLayer.update(n),this.$showGutter&&this.$gutterLayer.update(n)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(n):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(n),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(n),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(n),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(n),this._signal("afterRender")},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,n=Math.max((this.$minLines||1)*this.lineHeight,Math.min(t,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(n+=this.scrollBarH.getHeight());var r=e>t;if(n!=this.desiredHeight||this.$size.height!=this.desiredHeight||r!=this.$vScroll){r!=this.$vScroll&&(this.$vScroll=r,this.scrollBarV.setVisible(r));var i=this.container.clientWidth;this.container.style.height=n+"px",this.$updateCachedSize(!0,this.$gutterWidth,i,n),this.desiredHeight=n,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,n=t.height<=2*this.lineHeight,r=this.session.getScreenLength(),i=r*this.lineHeight,s=this.$getLongestLine(),o=!n&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-s-2*this.$padding<0),u=this.$horizScroll!==o;u&&(this.$horizScroll=o,this.scrollBarH.setVisible(o));var a=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var f=this.scrollTop%this.lineHeight,l=t.scrollerHeight+this.lineHeight,c=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;i+=c;var h=this.scrollMargin;this.session.setScrollTop(Math.max(-h.top,Math.min(this.scrollTop,i-t.scrollerHeight+h.bottom))),this.session.setScrollLeft(Math.max(-h.left,Math.min(this.scrollLeft,s+2*this.$padding-t.scrollerWidth+h.right)));var p=!n&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-i+c<0||this.scrollTop>h.top),d=a!==p;d&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var v=Math.ceil(l/this.lineHeight)-1,m=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),g=m+v,y,b,w=this.lineHeight;m=e.screenToDocumentRow(m,0);var E=e.getFoldLine(m);E&&(m=E.start.row),y=e.documentToScreenRow(m,0),b=e.getRowLength(m)*w,g=Math.min(e.screenToDocumentRow(g,0),e.getLength()-1),l=t.scrollerHeight+e.getRowLength(g)*w+b,f=this.scrollTop-y*w;var S=0;this.layerConfig.width!=s&&(S=this.CHANGE_H_SCROLL);if(u||d)S=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),d&&(s=this.$getLongestLine());return this.layerConfig={width:s,padding:this.$padding,firstRow:m,firstRowScreen:y,lastRow:g,lineHeight:w,characterWidth:this.characterWidth,minHeight:l,maxHeight:i,offset:f,gutterOffset:Math.max(0,Math.ceil((f+t.height-t.scrollerHeight)/w)),height:this.$size.scrollerHeight},S},this.$updateLines=function(){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var n=this.layerConfig;if(e>n.lastRow+1)return;if(ts?(t&&a+o>s+this.lineHeight&&(s-=t*this.$size.scrollerHeight),s===0&&(s=-this.scrollMargin.top),this.session.setScrollTop(s)):a+this.$size.scrollerHeight-ui?(i=1-this.scrollMargin.top)return!0;if(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom)return!0;if(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left)return!0;if(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right)return!0},this.pixelToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=(e+this.scrollLeft-n.left-this.$padding)/this.characterWidth,i=Math.floor((t+this.scrollTop-n.top)/this.lineHeight),s=Math.round(r);return{row:i,column:s,side:r-s>0?1:-1}},this.screenToTextCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=Math.round((e+this.scrollLeft-n.left-this.$padding)/this.characterWidth),i=(t+this.scrollTop-n.top)/this.lineHeight;return this.session.screenToDocumentPosition(i,Math.max(r,0))},this.textToScreenCoordinates=function(e,t){var n=this.scroller.getBoundingClientRect(),r=this.session.documentToScreenPosition(e,t),i=this.$padding+Math.round(r.column*this.characterWidth),s=r.row*this.lineHeight;return{pageX:n.left+i-this.scrollLeft,pageY:n.top+s-this.scrollTop}},this.visualizeFocus=function(){i.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){i.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,i.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){if(!this.$composition)return;i.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null},this.setTheme=function(e,t){function o(r){if(n.$themeId!=e)return t&&t();if(!r.cssClass)return;i.importCssString(r.cssText,r.cssClass,n.container.ownerDocument),n.theme&&i.removeCssClass(n.container,n.theme.cssClass);var s="padding"in r?r.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&s!=n.$padding&&n.setPadding(s),n.$theme=r.cssClass,n.theme=r,i.addCssClass(n.container,r.cssClass),i.setCssClass(n.container,"ace_dark",r.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:r}),t&&t()}var n=this;this.$themeId=e,n._dispatchEvent("themeChange",{theme:e});if(!e||typeof e=="string"){var r=e||this.$options.theme.initialValue;s.loadModule(["theme",r],o)}else o(e)},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){i.setCssClass(this.container,e,t!==!1)},this.unsetStyle=function(e){i.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),s.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){typeof e=="number"&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){i.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight){this.$gutterLineHighlight=i.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",this.$gutter.appendChild(this.$gutterLineHighlight);return}this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){(!this.$hScrollBarAlwaysVisible||!this.$horizScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){(!this.$vScrollBarAlwaysVisible||!this.$vScroll)&&this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){typeof e=="number"&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},scrollPastEnd:{set:function(e){e=+e||0;if(this.$scrollPastEnd==e)return;this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/net"),s=e("../lib/event_emitter").EventEmitter,o=e("../config"),u=function(t,n,r,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl);if(o.get("packaged")||!e.toUrl)i=i||o.moduleUrl(n,"worker");else{var s=this.$normalizePath;i=i||s(e.toUrl("ace/worker/worker.js",null,"_"));var u={};t.forEach(function(t){u[t]=s(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(i)}catch(a){if(!(a instanceof window.DOMException))throw a;var f=this.$workerBlob(i),l=window.URL||window.webkitURL,c=l.createObjectURL(f);this.$worker=new Worker(c),l.revokeObjectURL(c)}this.$worker.postMessage({init:!0,tlns:u,module:n,classname:r}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){r.implement(this,s),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var n=this.callbacks[t.id];n&&(n(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return i.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,n){if(n){var r=this.callbackId++;this.callbacks[r]=n,t.push(r)}this.send(e,t)},this.emit=function(e,t){try{this.$worker.postMessage({event:e,data:{data:t.data}})}catch(n){console.error(n.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),e.action=="insert"?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;if(!e)return;this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e})},this.$workerBlob=function(e){var t="importScripts('"+i.qualifyURL(e)+"');";try{return new Blob([t],{type:"application/javascript"})}catch(n){var r=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,s=new r;return s.append(t),s.getBlob("application/javascript")}}}).call(u.prototype);var a=function(e,t,n){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var r=null,i=!1,u=Object.create(s),a=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){a.messageBuffer.push(e),r&&(i?setTimeout(f):f())},this.setEmitSync=function(e){i=e};var f=function(){var e=a.messageBuffer.shift();e.command?r[e.command].apply(r,e.args):e.event&&u._signal(e.event,e.data)};u.postMessage=function(e){a.onMessage({data:e})},u.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},u.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},o.loadModule(["worker",t],function(e){r=new e[n](u);while(a.messageBuffer.length)f()})};a.prototype=u.prototype,t.UIWorkerClient=a,t.WorkerClient=u}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,n){"use strict";var r=e("./range").Range,i=e("./lib/event_emitter").EventEmitter,s=e("./lib/oop"),o=function(e,t,n,r,i,s){var o=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=i,this.othersClass=s,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=r,this.$onCursorChange=function(){setTimeout(function(){o.onCursorChange()})},this.$pos=n;var u=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=u.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){s.implement(this,i),this.setup=function(){var e=this,t=this.doc,n=this.session;this.selectionBefore=n.selection.toJSON(),n.selection.inMultiSelectMode&&n.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var i=this.pos;i.$insertRight=!0,i.detach(),i.markerId=n.addMarker(new r(i.row,i.column,i.row,i.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(n){var r=t.createAnchor(n.row,n.column);r.$insertRight=!0,r.detach(),e.others.push(r)}),n.setUndoSelect(!1)},this.showOtherMarkers=function(){if(this.othersActive)return;var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(n){n.markerId=e.addMarker(new r(n.row,n.column,n.row,n.column+t.length),t.othersClass,null,!1)})},this.hideOtherMarkers=function(){if(!this.othersActive)return;this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,s=t.start.column-this.pos.column;this.updateAnchors(e),i&&(this.length+=n);if(i&&!this.session.$fromUndo)if(e.action==="insert")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.insertMergedLines(a,e.lines)}else if(e.action==="remove")for(var o=this.others.length-1;o>=0;o--){var u=this.others[o],a={row:u.row,column:u.column+s};this.doc.remove(new r(a.row,a.column,a.row,a.column-n))}this.$updating=!1,this.updateMarkers()},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(this.$updating)return;var e=this,t=this.session,n=function(n,i){t.removeMarker(n.markerId),n.markerId=t.addMarker(new r(n.row,n.column,n.row,n.column+e.length),i,null,!1)};n(this.pos,this.mainClass);for(var i=this.others.length;i--;)n(this.others[i],this.othersClass)},this.onCursorChange=function(e){if(this.$updating||!this.session)return;var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth===-1)return;var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth;for(var n=0;n1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){this.rangeCount=this.rangeList.ranges.length;if(this.rangeCount==1&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var n=e.length;n--;){var r=this.ranges.indexOf(e[n]);this.ranges.splice(r,1)}this._signal("removeRange",{ranges:e}),this.rangeCount===0&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),t=t||this.ranges[0],t&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){if(this.rangeList)return;this.rangeList=new r,this.ranges=[],this.rangeCount=0},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var n=this.getRange(),r=this.isBackwards(),s=n.start.row,o=n.end.row;if(s==o){if(r)var u=n.end,a=n.start;else var u=n.start,a=n.end;this.addRange(i.fromPoints(a,a)),this.addRange(i.fromPoints(u,u));return}var f=[],l=this.getLineRange(s,!0);l.start.column=n.start.column,f.push(l);for(var c=s+1;c1){var e=this.rangeList.ranges,t=e[e.length-1],n=i.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(n,t.cursor==t.start)}else{var r=this.session.documentToScreenPosition(this.selectionLead),s=this.session.documentToScreenPosition(this.selectionAnchor),o=this.rectangularRangeBlock(r,s);o.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,n){var r=[],s=e.column0)d--;if(d>0){var m=0;while(r[m].isEmpty())m++}for(var g=d;g>=m;g--)r[g].isEmpty()&&r.splice(g,1)}return r}}.call(s.prototype);var d=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(!e.marker)return;this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);t!=-1&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length},this.removeSelectionMarkers=function(e){var t=this.session.$selectionMarkers;for(var n=e.length;n--;){var r=e[n];if(!r.marker)continue;this.session.removeMarker(r.marker);var i=t.indexOf(r);i!=-1&&t.splice(i,1)}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){if(this.inMultiSelectMode)return;this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(f.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onSingleSelect=function(e){if(this.session.multiSelect.inVirtualMode)return;this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(f.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection")},this.$onMultiSelectExec=function(e){var t=e.command,n=e.editor;if(!n.multiSelect)return;if(!t.multiSelectAction){var r=t.exec(n,e.args||{});n.multiSelect.addRange(n.multiSelect.toOrientedRange()),n.multiSelect.mergeOverlappingRanges()}else t.multiSelectAction=="forEach"?r=n.forEachSelection(t,e.args):t.multiSelectAction=="forEachLine"?r=n.forEachSelection(t,e.args,!0):t.multiSelectAction=="single"?(n.exitMultiSelectMode(),r=t.exec(n,e.args||{})):r=t.multiSelectAction(n,e.args||{});return r},this.forEachSelection=function(e,t,n){if(this.inVirtualSelectionMode)return;var r=n&&n.keepOrder,i=n==1||n&&n.$byLines,o=this.session,u=this.selection,a=u.rangeList,f=(r?u:a).ranges,l;if(!f.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var c=u._eventRegistry;u._eventRegistry={};var h=new s(o);this.inVirtualSelectionMode=!0;for(var p=f.length;p--;){if(i)while(p>0&&f[p].start.row==f[p-1].end.row)p--;h.fromOrientedRange(f[p]),h.index=p,this.selection=o.selection=h;var d=e.exec?e.exec(this,t||{}):e(this,t||{});!l&&d!==undefined&&(l=d),h.toOrientedRange(f[p])}h.detach(),this.selection=o.selection=u,this.inVirtualSelectionMode=!1,u._eventRegistry=c,u.mergeOverlappingRanges();var v=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),v&&v.from==v.to&&this.renderer.animateScrolling(v.from),l},this.exitMultiSelectMode=function(){if(!this.inMultiSelectMode||this.inVirtualSelectionMode)return;this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){var t=this.multiSelect.rangeList.ranges,n=[];for(var r=0;r0);u<0&&(u=0),f>=c&&(f=c-1)}var p=this.session.removeFullLines(u,f);p=this.$reAlignText(p,l),this.session.insert({row:u,column:0},p.join("\n")+"\n"),l||(o.start.column=0,o.end.column=p[p.length-1].length),this.selection.setRange(o)}else{s.forEach(function(e){t.substractPoint(e.cursor)});var d=0,v=Infinity,m=n.map(function(t){var n=t.cursor,r=e.getLine(n.row),i=r.substr(n.column).search(/\S/g);return i==-1&&(i=0),n.column>d&&(d=n.column),io?e.insert(r,a.stringRepeat(" ",s-o)):e.remove(new i(r.row,r.column,r.row,r.column-s+o)),t.start.column=t.end.column=d,t.start.row=t.end.row=r.row,t.cursor=t.end}),t.fromOrientedRange(n[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}},this.$reAlignText=function(e,t){function u(e){return a.stringRepeat(" ",e)}function f(e){return e[2]?u(i)+e[2]+u(s-e[2].length+o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function l(e){return e[2]?u(i+s-e[2].length)+e[2]+u(o," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function c(e){return e[2]?u(i)+e[2]+u(o)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var n=!0,r=!0,i,s,o;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?i==null?(i=t[1].length,s=t[2].length,o=t[3].length,t):(i+s+o!=t[1].length+t[2].length+t[3].length&&(r=!1),i!=t[1].length&&(n=!1),i>t[1].length&&(i=t[1].length),st[3].length&&(o=t[3].length),t):[e]}).map(t?f:n?r?l:f:c)}}).call(d.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var n=e.oldSession;n&&(n.multiSelect.off("addRange",this.$onAddRange),n.multiSelect.off("removeRange",this.$onRemoveRange),n.multiSelect.off("multiSelect",this.$onMultiSelect),n.multiSelect.off("singleSelect",this.$onSingleSelect),n.multiSelect.lead.off("change",this.$checkMultiselectChange),n.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=m,e("./config").defineOptions(d.prototype,"editor",{enableMultiselect:{set:function(e){m(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",o)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",o))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../../range").Range,i=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);return this.foldingStartMarker.test(r)?"start":t=="markbeginend"&&this.foldingStopMarker&&this.foldingStopMarker.test(r)?"end":""},this.getFoldWidgetRange=function(e,t,n){return null},this.indentationBlock=function(e,t,n){var i=/\S/,s=e.getLine(t),o=s.search(i);if(o==-1)return;var u=n||s.length,a=e.getLength(),f=t,l=t;while(++tf){var h=e.getLine(l).length;return new r(f,u,l,h)}},this.openingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i+1},u=e.$findClosingBracket(t,o,s);if(!u)return;var a=e.foldWidgets[u.row];return a==null&&(a=e.getFoldWidget(u.row)),a=="start"&&u.row>o.row&&(u.row--,u.column=e.getLine(u.row).length),r.fromPoints(o,u)},this.closingBracketBlock=function(e,t,n,i,s){var o={row:n,column:i},u=e.$findOpeningBracket(t,o);if(!u)return;return u.column++,o.column--,r.fromPoints(u,o)}}).call(i.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,n){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=e("./lib/oop"),i=e("./lib/dom"),s=e("./range").Range;(function(){this.getRowLength=function(e){var t;return this.lineWidgets?t=this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:t=0,!this.$useWrapMode||!this.$wrapData[e]?1+t:this.$wrapData[e].length+1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach();if(this.editor==e)return;this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets))},this.detach=function(e){var t=this.editor;if(!t)return;this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var n=this.session.lineWidgets;n&&n.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})},this.updateOnFold=function(e,t){var n=t.lineWidgets;if(!n||!e.action)return;var r=e.data,i=r.start.row,s=r.end.row,o=e.action=="add";for(var u=i+1;u0&&!r[i])i--;this.firstRow=n.firstRow,this.lastRow=n.lastRow,t.$cursorLayer.config=n;for(var o=i;o<=s;o++){var u=r[o];if(!u||!u.el)continue;if(u.hidden){u.el.style.top=-100-(u.pixelHeight||0)+"px";continue}u._inDocument||(u._inDocument=!0,t.container.appendChild(u.el));var a=t.$cursorLayer.getPixelPosition({row:o,column:0},!0).top;u.coverLine||(a+=n.lineHeight*this.session.getRowLineCount(u.row)),u.el.style.top=a-n.offset+"px";var f=u.coverGutter?0:t.gutterWidth;u.fixedWidth||(f-=t.scrollLeft),u.el.style.left=f+"px",u.fullWidth&&u.screenWidth&&(u.el.style.minWidth=n.width+2*n.padding+"px"),u.fixedWidth?u.el.style.right=t.scrollBar.getWidth()+"px":u.el.style.right=""}}}).call(o.prototype),t.LineWidgets=o}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,n){"use strict";function o(e,t,n){var r=0,i=e.length-1;while(r<=i){var s=r+i>>1,o=n(t,e[s]);if(o>0)r=s+1;else{if(!(o<0))return s;i=s-1}}return-(r+1)}function u(e,t,n){var r=e.getAnnotations().sort(s.comparePoints);if(!r.length)return;var i=o(r,{row:t,column:-1},s.comparePoints);i<0&&(i=-i-1),i>=r.length?i=n>0?0:r.length-1:i===0&&n<0&&(i=r.length-1);var u=r[i];if(!u||!n)return;if(u.row===t){do u=r[i+=n];while(u&&u.row===t);if(!u)return r.slice()}var a=[];t=u.row;do a[n<0?"unshift":"push"](u),u=r[i+=n];while(u&&u.row==t);return a.length&&a}var r=e("../line_widgets").LineWidgets,i=e("../lib/dom"),s=e("../range").Range;t.showErrorMarker=function(e,t){var n=e.session;n.widgetManager||(n.widgetManager=new r(n),n.widgetManager.attach(e));var s=e.getCursorPosition(),o=s.row,a=n.widgetManager.getWidgetsAtRow(o).filter(function(e){return e.type=="errorMarker"})[0];a?a.destroy():o-=t;var f=u(n,o,t),l;if(f){var c=f[0];s.column=(c.pos&&typeof c.column!="number"?c.pos.sc:c.column)||0,s.row=c.row,l=e.renderer.$gutterLayer.$annotations[s.row]}else{if(a)return;l={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(s.row),e.selection.moveToPosition(s);var h={row:s.row,fixedWidth:!0,coverGutter:!0,el:i.createElement("div"),type:"errorMarker"},p=h.el.appendChild(i.createElement("div")),d=h.el.appendChild(i.createElement("div"));d.className="error_widget_arrow "+l.className;var v=e.renderer.$cursorLayer.getPixelPosition(s).left;d.style.left=v+e.renderer.gutterWidth-5+"px",h.el.className="error_widget_wrapper",p.className="error_widget "+l.className,p.innerHTML=l.text.join("
      "),p.appendChild(i.createElement("div"));var m=function(e,t,n){if(t===0&&(n==="esc"||n==="return"))return h.destroy(),{command:"null"}};h.destroy=function(){if(e.$mouseHandler.isMousePressed)return;e.keyBinding.removeKeyboardHandler(m),n.widgetManager.removeLineWidget(h),e.off("changeSelection",h.destroy),e.off("changeSession",h.destroy),e.off("mouseup",h.destroy),e.off("change",h.destroy)},e.keyBinding.addKeyboardHandler(m),e.on("changeSelection",h.destroy),e.on("changeSession",h.destroy),e.on("mouseup",h.destroy),e.on("change",h.destroy),e.session.widgetManager.addLineWidget(h),h.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:h.el.offsetHeight})},i.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),i=e("./lib/event"),s=e("./editor").Editor,o=e("./edit_session").EditSession,u=e("./undomanager").UndoManager,a=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.require=e,t.edit=function(e){if(typeof e=="string"){var n=e;e=document.getElementById(n);if(!e)throw new Error("ace.edit can't find div #"+n)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var o="";if(e&&/input|textarea/i.test(e.tagName)){var u=e;o=u.value,e=r.createElement("pre"),u.parentNode.replaceChild(e,u)}else e&&(o=r.getInnerText(e),e.innerHTML="");var f=t.createEditSession(o),l=new s(new a(e));l.setSession(f);var c={document:f,editor:l,onResize:l.resize.bind(l,null)};return u&&(c.textarea=u),i.addListener(window,"resize",c.onResize),l.on("destroy",function(){i.removeListener(window,"resize",c.onResize),c.editor.container.env=null}),l.container.env=l.env=c,l},t.createEditSession=function(e,t){var n=new o(e,t);return n.setUndoManager(new u),n},t.EditSession=o,t.UndoManager=u,t.version="1.2.3"}); + (function() { + ace.require(["ace/ace"], function(a) { + a && a.config.init(true); + if (!window.ace) + window.ace = a; + for (var key in a) if (a.hasOwnProperty(key)) + window.ace[key] = a[key]; + }); + })(); + \ No newline at end of file diff --git a/common/resources/lib/ui-ace/min/mode-javascript.js b/common/resources/lib/ui-ace/min/mode-javascript.js new file mode 100644 index 0000000..26a8bdc --- /dev/null +++ b/common/resources/lib/ui-ace/min/mode-javascript.js @@ -0,0 +1 @@ +ace.define("ace/mode/doc_comment_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment.doc.tag",regex:"@[\\w\\d_]+"},s.getTagRule(),{defaultToken:"comment.doc",caseInsensitive:!0}]}};r.inherits(s,i),s.getTagRule=function(e){return{token:"comment.doc.tag.storage.type",regex:"\\b(?:TODO|FIXME|XXX|HACK)\\b"}},s.getStartRule=function(e){return{token:"comment.doc",regex:"\\/\\*(?=\\*)",next:e}},s.getEndRule=function(e){return{token:"comment.doc",regex:"\\*\\/",next:e}},t.DocCommentHighlightRules=s}),ace.define("ace/mode/javascript_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/doc_comment_highlight_rules","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";function a(){var e=o.replace("\\d","\\d\\-"),t={onMatch:function(e,t,n){var r=e.charAt(1)=="/"?2:1;if(r==1)t!=this.nextState?n.unshift(this.next,this.nextState,0):n.unshift(this.next),n[2]++;else if(r==2&&t==this.nextState){n[1]--;if(!n[1]||n[1]<0)n.shift(),n.shift()}return[{type:"meta.tag.punctuation."+(r==1?"":"end-")+"tag-open.xml",value:e.slice(0,r)},{type:"meta.tag.tag-name.xml",value:e.substr(r)}]},regex:"",onMatch:function(e,t,n){return t==n[0]&&n.shift(),e.length==2&&(n[0]==this.nextState&&n[1]--,(!n[1]||n[1]<0)&&n.splice(0,2)),this.next=n[0]||"start",[{type:this.token,value:e}]},nextState:"jsx"},n,f("jsxAttributes"),{token:"entity.other.attribute-name.xml",regex:e},{token:"keyword.operator.attribute-equals.xml",regex:"="},{token:"text.tag-whitespace.xml",regex:"\\s+"},{token:"string.attribute-value.xml",regex:"'",stateName:"jsx_attr_q",push:[{token:"string.attribute-value.xml",regex:"'",next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},{token:"string.attribute-value.xml",regex:'"',stateName:"jsx_attr_qq",push:[{token:"string.attribute-value.xml",regex:'"',next:"pop"},{include:"reference"},{defaultToken:"string.attribute-value.xml"}]},t],this.$rules.reference=[{token:"constant.language.escape.reference.xml",regex:"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)"}]}function f(e){return[{token:"comment",regex:/\/\*/,next:[i.getTagRule(),{token:"comment",regex:"\\*\\/",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]},{token:"comment",regex:"\\/\\/",next:[i.getTagRule(),{token:"comment",regex:"$|^",next:e||"pop"},{defaultToken:"comment",caseInsensitive:!0}]}]}var r=e("../lib/oop"),i=e("./doc_comment_highlight_rules").DocCommentHighlightRules,s=e("./text_highlight_rules").TextHighlightRules,o="[a-zA-Z\\$_\u00a1-\uffff][a-zA-Z\\d\\$_\u00a1-\uffff]*\\b",u=function(e){var t=this.createKeywordMapper({"variable.language":"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Namespace|QName|XML|XMLList|ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|SyntaxError|TypeError|URIError|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|isNaN|parseFloat|parseInt|JSON|Math|this|arguments|prototype|window|document",keyword:"const|yield|import|get|set|break|case|catch|continue|default|delete|do|else|finally|for|function|if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|__parent__|__count__|escape|unescape|with|__proto__|class|enum|extends|super|export|implements|private|public|interface|package|protected|static","storage.type":"const|let|var|function","constant.language":"null|Infinity|NaN|undefined","support.function":"alert","constant.language.boolean":"true|false"},"identifier"),n="case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void",r="\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|u{[0-9a-fA-F]{1,6}}|[0-2][0-7]{0,2}|3[0-7][0-7]?|[4-7][0-7]?|.)";this.$rules={no_regex:[i.getStartRule("doc-start"),f("no_regex"),{token:"string",regex:"'(?=.)",next:"qstring"},{token:"string",regex:'"(?=.)',next:"qqstring"},{token:"constant.numeric",regex:/0(?:[xX][0-9a-fA-F]+|[bB][01]+)\b/},{token:"constant.numeric",regex:/[+-]?\d[\d_]*(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?\b/},{token:["storage.type","punctuation.operator","support.function","punctuation.operator","entity.name.function","text","keyword.operator"],regex:"("+o+")(\\.)(prototype)(\\.)("+o+")(\\s*)(=)",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","keyword.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(=)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(\\s+)(\\w+)(\\s*)(\\()",next:"function_arguments"},{token:["storage.type","text","entity.name.function","text","paren.lparen"],regex:"(function)(\\s+)("+o+")(\\s*)(\\()",next:"function_arguments"},{token:["entity.name.function","text","punctuation.operator","text","storage.type","text","paren.lparen"],regex:"("+o+")(\\s*)(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:["text","text","storage.type","text","paren.lparen"],regex:"(:)(\\s*)(function)(\\s*)(\\()",next:"function_arguments"},{token:"keyword",regex:"(?:"+n+")\\b",next:"start"},{token:["support.constant"],regex:/that\b/},{token:["storage.type","punctuation.operator","support.function.firebug"],regex:/(console)(\.)(warn|info|log|error|time|trace|timeEnd|assert)\b/},{token:t,regex:o},{token:"punctuation.operator",regex:/[.](?![.])/,next:"property"},{token:"keyword.operator",regex:/--|\+\+|\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/,next:"start"},{token:"punctuation.operator",regex:/[?:,;.]/,next:"start"},{token:"paren.lparen",regex:/[\[({]/,next:"start"},{token:"paren.rparen",regex:/[\])}]/},{token:"comment",regex:/^#!.*$/}],property:[{token:"text",regex:"\\s+"},{token:["storage.type","punctuation.operator","entity.name.function","text","keyword.operator","text","storage.type","text","entity.name.function","text","paren.lparen"],regex:"("+o+")(\\.)("+o+")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()",next:"function_arguments"},{token:"punctuation.operator",regex:/[.](?![.])/},{token:"support.function",regex:/(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/},{token:"support.function.dom",regex:/(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/},{token:"support.constant",regex:/(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/},{token:"identifier",regex:o},{regex:"",token:"empty",next:"no_regex"}],start:[i.getStartRule("doc-start"),f("start"),{token:"string.regexp",regex:"\\/",next:"regex"},{token:"text",regex:"\\s+|^$",next:"start"},{token:"empty",regex:"",next:"no_regex"}],regex:[{token:"regexp.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"string.regexp",regex:"/[sxngimy]*",next:"no_regex"},{token:"invalid",regex:/\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/},{token:"constant.language.escape",regex:/\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/},{token:"constant.language.delimiter",regex:/\|/},{token:"constant.language.escape",regex:/\[\^?/,next:"regex_character_class"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp"}],regex_character_class:[{token:"regexp.charclass.keyword.operator",regex:"\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)"},{token:"constant.language.escape",regex:"]",next:"regex"},{token:"constant.language.escape",regex:"-"},{token:"empty",regex:"$",next:"no_regex"},{defaultToken:"string.regexp.charachterclass"}],function_arguments:[{token:"variable.parameter",regex:o},{token:"punctuation.operator",regex:"[, ]+"},{token:"punctuation.operator",regex:"$"},{token:"empty",regex:"",next:"no_regex"}],qqstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qqstring"},{token:"string",regex:'"|$',next:"no_regex"},{defaultToken:"string"}],qstring:[{token:"constant.language.escape",regex:r},{token:"string",regex:"\\\\$",next:"qstring"},{token:"string",regex:"'|$",next:"no_regex"},{defaultToken:"string"}]};if(!e||!e.noES6)this.$rules.no_regex.unshift({regex:"[{}]",onMatch:function(e,t,n){this.next=e=="{"?this.nextState:"";if(e=="{"&&n.length)n.unshift("start",t);else if(e=="}"&&n.length){n.shift(),this.next=n.shift();if(this.next.indexOf("string")!=-1||this.next.indexOf("jsx")!=-1)return"paren.quasi.end"}return e=="{"?"paren.lparen":"paren.rparen"},nextState:"start"},{token:"string.quasi.start",regex:/`/,push:[{token:"constant.language.escape",regex:r},{token:"paren.quasi.start",regex:/\${/,push:"start"},{token:"string.quasi.end",regex:/`/,next:"pop"},{defaultToken:"string.quasi"}]}),(!e||!e.noJSX)&&a.call(this);this.embedRules(i,"doc-",[i.getEndRule("no_regex")]),this.normalizeRules()};r.inherits(u,s),t.JavaScriptHighlightRules=u}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,n){"use strict";var r=e("../range").Range,i=function(){};(function(){this.checkOutdent=function(e,t){return/^\s+$/.test(e)?/^\s*\}/.test(t):!1},this.autoOutdent=function(e,t){var n=e.getLine(t),i=n.match(/^(\s*\})/);if(!i)return 0;var s=i[1].length,o=e.findMatchingBracket({row:t,column:s});if(!o||o.row==t)return 0;var u=this.$getIndent(e.getLine(o.row));e.replace(new r(t,0,t,s-1),u)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(i.prototype),t.MatchingBraceOutdent=i}),ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../behaviour").Behaviour,s=e("../../token_iterator").TokenIterator,o=e("../../lib/lang"),u=["text","paren.rparen","punctuation.operator"],a=["text","paren.rparen","punctuation.operator","comment"],f,l={},c=function(e){var t=-1;e.multiSelect&&(t=e.selection.index,l.rangeCount!=e.multiSelect.rangeCount&&(l={rangeCount:e.multiSelect.rangeCount}));if(l[t])return f=l[t];f=l[t]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""}},h=function(e,t,n,r){var i=e.end.row-e.start.row;return{text:n+t+r,selection:[0,e.start.column+1,i,e.end.column+(i?0:1)]}},p=function(){this.add("braces","insertion",function(e,t,n,r,i){var s=n.getCursorPosition(),u=r.doc.getLine(s.row);if(i=="{"){c(n);var a=n.getSelectionRange(),l=r.doc.getTextRange(a);if(l!==""&&l!=="{"&&n.getWrapBehavioursEnabled())return h(a,l,"{","}");if(p.isSaneInsertion(n,r))return/[\]\}\)]/.test(u[s.column])||n.inMultiSelectMode?(p.recordAutoInsert(n,r,"}"),{text:"{}",selection:[1,1]}):(p.recordMaybeInsert(n,r,"{"),{text:"{",selection:[1,1]})}else if(i=="}"){c(n);var d=u.substring(s.column,s.column+1);if(d=="}"){var v=r.$findOpeningBracket("}",{column:s.column+1,row:s.row});if(v!==null&&p.isAutoInsertedClosing(s,u,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if(i=="\n"||i=="\r\n"){c(n);var m="";p.isMaybeInsertedClosing(s,u)&&(m=o.stringRepeat("}",f.maybeInsertedBrackets),p.clearMaybeInsertedClosing());var d=u.substring(s.column,s.column+1);if(d==="}"){var g=r.findMatchingBracket({row:s.row,column:s.column+1},"}");if(!g)return null;var y=this.$getIndent(r.getLine(g.row))}else{if(!m){p.clearMaybeInsertedClosing();return}var y=this.$getIndent(u)}var b=y+r.getTabString();return{text:"\n"+b+"\n"+y+m,selection:[1,b.length,1,b.length]}}p.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="{"){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.end.column,i.end.column+1);if(u=="}")return i.end.column++,i;f.maybeInsertedBrackets--}}),this.add("parens","insertion",function(e,t,n,r,i){if(i=="("){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"(",")");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,")"),{text:"()",selection:[1,1]}}else if(i==")"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f==")"){var l=r.$findOpeningBracket(")",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="("){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==")")return i.end.column++,i}}),this.add("brackets","insertion",function(e,t,n,r,i){if(i=="["){c(n);var s=n.getSelectionRange(),o=r.doc.getTextRange(s);if(o!==""&&n.getWrapBehavioursEnabled())return h(s,o,"[","]");if(p.isSaneInsertion(n,r))return p.recordAutoInsert(n,r,"]"),{text:"[]",selection:[1,1]}}else if(i=="]"){c(n);var u=n.getCursorPosition(),a=r.doc.getLine(u.row),f=a.substring(u.column,u.column+1);if(f=="]"){var l=r.$findOpeningBracket("]",{column:u.column+1,row:u.row});if(l!==null&&p.isAutoInsertedClosing(u,a,i))return p.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&s=="["){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u=="]")return i.end.column++,i}}),this.add("string_dquotes","insertion",function(e,t,n,r,i){if(i=='"'||i=="'"){c(n);var s=i,o=n.getSelectionRange(),u=r.doc.getTextRange(o);if(u!==""&&u!=="'"&&u!='"'&&n.getWrapBehavioursEnabled())return h(o,u,s,s);if(!u){var a=n.getCursorPosition(),f=r.doc.getLine(a.row),l=f.substring(a.column-1,a.column),p=f.substring(a.column,a.column+1),d=r.getTokenAt(a.row,a.column),v=r.getTokenAt(a.row,a.column+1);if(l=="\\"&&d&&/escape/.test(d.type))return null;var m=d&&/string|escape/.test(d.type),g=!v||/string|escape/.test(v.type),y;if(p==s)y=m!==g;else{if(m&&!g)return null;if(m&&g)return null;var b=r.$mode.tokenRe;b.lastIndex=0;var w=b.test(l);b.lastIndex=0;var E=b.test(l);if(w||E)return null;if(p&&!/[\s;,.})\]\\]/.test(p))return null;y=!0}return{text:y?s+s:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(e,t,n,r,i){var s=r.doc.getTextRange(i);if(!i.isMultiLine()&&(s=='"'||s=="'")){c(n);var o=r.doc.getLine(i.start.row),u=o.substring(i.start.column+1,i.start.column+2);if(u==s)return i.end.column++,i}})};p.isSaneInsertion=function(e,t){var n=e.getCursorPosition(),r=new s(t,n.row,n.column);if(!this.$matchTokenType(r.getCurrentToken()||"text",u)){var i=new s(t,n.row,n.column+1);if(!this.$matchTokenType(i.getCurrentToken()||"text",u))return!1}return r.stepForward(),r.getCurrentTokenRow()!==n.row||this.$matchTokenType(r.getCurrentToken()||"text",a)},p.$matchTokenType=function(e,t){return t.indexOf(e.type||e)>-1},p.recordAutoInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isAutoInsertedClosing(r,i,f.autoInsertedLineEnd[0])||(f.autoInsertedBrackets=0),f.autoInsertedRow=r.row,f.autoInsertedLineEnd=n+i.substr(r.column),f.autoInsertedBrackets++},p.recordMaybeInsert=function(e,t,n){var r=e.getCursorPosition(),i=t.doc.getLine(r.row);this.isMaybeInsertedClosing(r,i)||(f.maybeInsertedBrackets=0),f.maybeInsertedRow=r.row,f.maybeInsertedLineStart=i.substr(0,r.column)+n,f.maybeInsertedLineEnd=i.substr(r.column),f.maybeInsertedBrackets++},p.isAutoInsertedClosing=function(e,t,n){return f.autoInsertedBrackets>0&&e.row===f.autoInsertedRow&&n===f.autoInsertedLineEnd[0]&&t.substr(e.column)===f.autoInsertedLineEnd},p.isMaybeInsertedClosing=function(e,t){return f.maybeInsertedBrackets>0&&e.row===f.maybeInsertedRow&&t.substr(e.column)===f.maybeInsertedLineEnd&&t.substr(0,e.column)==f.maybeInsertedLineStart},p.popAutoInsertedClosing=function(){f.autoInsertedLineEnd=f.autoInsertedLineEnd.substr(1),f.autoInsertedBrackets--},p.clearMaybeInsertedClosing=function(){f&&(f.maybeInsertedBrackets=0,f.maybeInsertedRow=-1)},r.inherits(p,i),t.CstyleBehaviour=p}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,n){"use strict";var r=e("../../lib/oop"),i=e("../../range").Range,s=e("./fold_mode").FoldMode,o=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};r.inherits(o,s),function(){this.foldingStartMarker=/(\{|\[)[^\}\]]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,n){var r=e.getLine(n);if(this.singleLineBlockCommentRe.test(r)&&!this.startRegionRe.test(r)&&!this.tripleStarBlockCommentRe.test(r))return"";var i=this._getFoldWidgetBase(e,t,n);return!i&&this.startRegionRe.test(r)?"start":i},this.getFoldWidgetRange=function(e,t,n,r){var i=e.getLine(n);if(this.startRegionRe.test(i))return this.getCommentRegionBlock(e,i,n);var s=i.match(this.foldingStartMarker);if(s){var o=s.index;if(s[1])return this.openingBracketBlock(e,s[1],n,o);var u=e.getCommentFoldRange(n,o+s[0].length,1);return u&&!u.isMultiLine()&&(r?u=this.getSectionRange(e,n):t!="all"&&(u=null)),u}if(t==="markbegin")return;var s=i.match(this.foldingStopMarker);if(s){var o=s.index+s[0].length;return s[1]?this.closingBracketBlock(e,s[1],n,o):e.getCommentFoldRange(n,o,-1)}},this.getSectionRange=function(e,t){var n=e.getLine(t),r=n.search(/\S/),s=t,o=n.length;t+=1;var u=t,a=e.getLength();while(++tf)break;var l=this.getFoldWidgetRange(e,"all",t);if(l){if(l.start.row<=s)break;if(l.isMultiLine())t=l.end.row;else if(r==f)break}u=t}return new i(s,o,u,e.getLine(u).length)},this.getCommentRegionBlock=function(e,t,n){var r=t.search(/\s*$/),s=e.getLength(),o=n,u=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,a=1;while(++no)return new i(o,r,l,t.length)}}.call(o.prototype)}),ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./javascript_highlight_rules").JavaScriptHighlightRules,o=e("./matching_brace_outdent").MatchingBraceOutdent,u=e("../range").Range,a=e("../worker/worker_client").WorkerClient,f=e("./behaviour/cstyle").CstyleBehaviour,l=e("./folding/cstyle").FoldMode,c=function(){this.HighlightRules=s,this.$outdent=new o,this.$behaviour=new f,this.foldingRules=new l};r.inherits(c,i),function(){this.lineCommentStart="//",this.blockComment={start:"/*",end:"*/"},this.getNextLineIndent=function(e,t,n){var r=this.$getIndent(t),i=this.getTokenizer().getLineTokens(t,e),s=i.tokens,o=i.state;if(s.length&&s[s.length-1].type=="comment")return r;if(e=="start"||e=="no_regex"){var u=t.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/);u&&(r+=n)}else if(e=="doc-start"){if(o=="start"||o=="no_regex")return"";var u=t.match(/^\s*(\/?)\*/);u&&(u[1]&&(r+=" "),r+="* ")}return r},this.checkOutdent=function(e,t,n){return this.$outdent.checkOutdent(t,n)},this.autoOutdent=function(e,t,n){this.$outdent.autoOutdent(t,n)},this.createWorker=function(e){var t=new a(["ace"],"ace/mode/javascript_worker","JavaScriptWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/javascript"}.call(c.prototype),t.Mode=c}) \ No newline at end of file diff --git a/common/resources/lib/ui-ace/min/theme-github.js b/common/resources/lib/ui-ace/min/theme-github.js new file mode 100644 index 0000000..2401002 --- /dev/null +++ b/common/resources/lib/ui-ace/min/theme-github.js @@ -0,0 +1 @@ +ace.define("ace/theme/github",["require","exports","module","ace/lib/dom"],function(e,t,n){t.isDark=!1,t.cssClass="ace-github",t.cssText='.ace-github .ace_gutter {background: #e8e8e8;color: #AAA;}.ace-github {background: #fff;color: #000;}.ace-github .ace_keyword {font-weight: bold;}.ace-github .ace_string {color: #D14;}.ace-github .ace_variable.ace_class {color: teal;}.ace-github .ace_constant.ace_numeric {color: #099;}.ace-github .ace_constant.ace_buildin {color: #0086B3;}.ace-github .ace_support.ace_function {color: #0086B3;}.ace-github .ace_comment {color: #998;font-style: italic;}.ace-github .ace_variable.ace_language {color: #0086B3;}.ace-github .ace_paren {font-weight: bold;}.ace-github .ace_boolean {font-weight: bold;}.ace-github .ace_string.ace_regexp {color: #009926;font-weight: normal;}.ace-github .ace_variable.ace_instance {color: teal;}.ace-github .ace_constant.ace_language {font-weight: bold;}.ace-github .ace_cursor {color: black;}.ace-github.ace_focus .ace_marker-layer .ace_active-line {background: rgb(255, 255, 204);}.ace-github .ace_marker-layer .ace_active-line {background: rgb(245, 245, 245);}.ace-github .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-github.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-github.ace_nobold .ace_line > span {font-weight: normal !important;}.ace-github .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-github .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-github .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-github .ace_gutter-active-line {background-color : rgba(0, 0, 0, 0.07);}.ace-github .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-github .ace_invisible {color: #BFBFBF}.ace-github .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-github .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var r=e("../lib/dom");r.importCssString(t.cssText,t.cssClass)}) \ No newline at end of file diff --git a/common/resources/lib/ui-ace/min/worker-javascript.js b/common/resources/lib/ui-ace/min/worker-javascript.js new file mode 100644 index 0000000..bca38f0 --- /dev/null +++ b/common/resources/lib/ui-ace/min/worker-javascript.js @@ -0,0 +1 @@ +"no use strict";(function(e){function t(e,t){var n=e,r="";while(n){var i=t[n];if(typeof i=="string")return i+r;if(i)return i.location.replace(/\/*$/,"/")+(r||i.main||i.name);if(i===!1)return"";var s=n.lastIndexOf("/");if(s===-1)break;r=n.substr(s)+r,n=n.slice(0,s)}return e}if(typeof e.window!="undefined"&&e.document)return;if(e.require&&e.define)return;e.console||(e.console=function(){var e=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:e})},e.console.error=e.console.warn=e.console.log=e.console.trace=e.console),e.window=e,e.ace=e,e.onerror=function(e,t,n,r,i){postMessage({type:"error",data:{message:e,data:i.data,file:t,line:n,col:r,stack:i.stack}})},e.normalizeModule=function(t,n){if(n.indexOf("!")!==-1){var r=n.split("!");return e.normalizeModule(t,r[0])+"!"+e.normalizeModule(t,r[1])}if(n.charAt(0)=="."){var i=t.split("/").slice(0,-1).join("/");n=(i?i+"/":"")+n;while(n.indexOf(".")!==-1&&s!=n){var s=n;n=n.replace(/^\.\//,"").replace(/\/\.\//,"/").replace(/[^\/]+\/\.\.\//,"")}}return n},e.require=function(r,i){i||(i=r,r=null);if(!i.charAt)throw new Error("worker.js require() accepts only (parentId, id) as arguments");i=e.normalizeModule(r,i);var s=e.require.modules[i];if(s)return s.initialized||(s.initialized=!0,s.exports=s.factory().exports),s.exports;if(!e.require.tlns)return console.log("unable to load "+i);var o=t(i,e.require.tlns);return o.slice(-3)!=".js"&&(o+=".js"),e.require.id=i,e.require.modules[i]={},importScripts(o),e.require(r,i)},e.require.modules={},e.require.tlns={},e.define=function(t,n,r){arguments.length==2?(r=n,typeof t!="string"&&(n=t,t=e.require.id)):arguments.length==1&&(r=t,n=[],t=e.require.id);if(typeof r!="function"){e.require.modules[t]={exports:r,initialized:!0};return}n.length||(n=["require","exports","module"]);var i=function(n){return e.require(t,n)};e.require.modules[t]={exports:{},factory:function(){var e=this,t=r.apply(this,n.map(function(t){switch(t){case"require":return i;case"exports":return e.exports;case"module":return e;default:return i(t)}}));return t&&(e.exports=t),e}}},e.define.amd={},require.tlns={},e.initBaseUrls=function(t){for(var n in t)require.tlns[n]=t[n]},e.initSender=function(){var n=e.require("ace/lib/event_emitter").EventEmitter,r=e.require("ace/lib/oop"),i=function(){};return function(){r.implement(this,n),this.callback=function(e,t){postMessage({type:"call",id:t,data:e})},this.emit=function(e,t){postMessage({type:"event",name:e,data:t})}}.call(i.prototype),new i};var n=e.main=null,r=e.sender=null;e.onmessage=function(t){var i=t.data;if(i.event&&r)r._signal(i.event,i.data);else if(i.command)if(n[i.command])n[i.command].apply(n,i.args);else{if(!e[i.command])throw new Error("Unknown command:"+i.command);e[i.command].apply(e,i.args)}else if(i.init){e.initBaseUrls(i.tlns),require("ace/lib/es5-shim"),r=e.sender=e.initSender();var s=require(i.module)[i.classname];n=e.main=new s(r)}}})(this),ace.define("ace/lib/oop",["require","exports","module"],function(e,t,n){"use strict";t.inherits=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})},t.mixin=function(e,t){for(var n in t)e[n]=t[n];return e},t.implement=function(e,n){t.mixin(e,n)}}),ace.define("ace/range",["require","exports","module"],function(e,t,n){"use strict";var r=function(e,t){return e.row-t.row||e.column-t.column},i=function(e,t,n,r){this.start={row:e,column:t},this.end={row:n,column:r}};(function(){this.isEqual=function(e){return this.start.row===e.start.row&&this.end.row===e.end.row&&this.start.column===e.start.column&&this.end.column===e.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(e,t){return this.compare(e,t)==0},this.compareRange=function(e){var t,n=e.end,r=e.start;return t=this.compare(n.row,n.column),t==1?(t=this.compare(r.row,r.column),t==1?2:t==0?1:0):t==-1?-2:(t=this.compare(r.row,r.column),t==-1?-1:t==1?42:0)},this.comparePoint=function(e){return this.compare(e.row,e.column)},this.containsRange=function(e){return this.comparePoint(e.start)==0&&this.comparePoint(e.end)==0},this.intersects=function(e){var t=this.compareRange(e);return t==-1||t==0||t==1},this.isEnd=function(e,t){return this.end.row==e&&this.end.column==t},this.isStart=function(e,t){return this.start.row==e&&this.start.column==t},this.setStart=function(e,t){typeof e=="object"?(this.start.column=e.column,this.start.row=e.row):(this.start.row=e,this.start.column=t)},this.setEnd=function(e,t){typeof e=="object"?(this.end.column=e.column,this.end.row=e.row):(this.end.row=e,this.end.column=t)},this.inside=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)||this.isStart(e,t)?!1:!0:!1},this.insideStart=function(e,t){return this.compare(e,t)==0?this.isEnd(e,t)?!1:!0:!1},this.insideEnd=function(e,t){return this.compare(e,t)==0?this.isStart(e,t)?!1:!0:!1},this.compare=function(e,t){return!this.isMultiLine()&&e===this.start.row?tthis.end.column?1:0:ethis.end.row?1:this.start.row===e?t>=this.start.column?0:-1:this.end.row===e?t<=this.end.column?0:1:0},this.compareStart=function(e,t){return this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.compareEnd=function(e,t){return this.end.row==e&&this.end.column==t?1:this.compare(e,t)},this.compareInside=function(e,t){return this.end.row==e&&this.end.column==t?1:this.start.row==e&&this.start.column==t?-1:this.compare(e,t)},this.clipRows=function(e,t){if(this.end.row>t)var n={row:t+1,column:0};else if(this.end.rowt)var r={row:t+1,column:0};else if(this.start.row=0&&t.row=0&&t.column<=e[t.row].length}function s(e,t){t.action!="insert"&&t.action!="remove"&&r(t,"delta.action must be 'insert' or 'remove'"),t.lines instanceof Array||r(t,"delta.lines must be an Array"),(!t.start||!t.end)&&r(t,"delta.start/end must be an present");var n=t.start;i(e,t.start)||r(t,"delta.start must be contained in document");var s=t.end;t.action=="remove"&&!i(e,s)&&r(t,"delta.end must contained in document for 'remove' actions");var o=s.row-n.row,u=s.column-(o==0?n.column:0);(o!=t.lines.length-1||t.lines[o].length!=u)&&r(t,"delta.range must match delta lines")}t.applyDelta=function(e,t,n){var r=t.start.row,i=t.start.column,s=e[r]||"";switch(t.action){case"insert":var o=t.lines;if(o.length===1)e[r]=s.substring(0,i)+t.lines[0]+s.substring(i);else{var u=[r,1].concat(t.lines);e.splice.apply(e,u),e[r]=s.substring(0,i)+e[r],e[r+t.lines.length-1]+=s.substring(i)}break;case"remove":var a=t.end.column,f=t.end.row;r===f?e[r]=s.substring(0,i)+s.substring(a):e.splice(r,f-r+1,s.substring(0,i)+e[f].substring(a))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(e,t,n){"use strict";var r={},i=function(){this.propagationStopped=!0},s=function(){this.defaultPrevented=!0};r._emit=r._dispatchEvent=function(e,t){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var n=this._eventRegistry[e]||[],r=this._defaultHandlers[e];if(!n.length&&!r)return;if(typeof t!="object"||!t)t={};t.type||(t.type=e),t.stopPropagation||(t.stopPropagation=i),t.preventDefault||(t.preventDefault=s),n=n.slice();for(var o=0;othis.row)return;var n=t(e,{row:this.row,column:this.column},this.$insertRight);this.setPosition(n.row,n.column,!0)},this.setPosition=function(e,t,n){var r;n?r={row:e,column:t}:r=this.$clipPositionToDocument(e,t);if(this.row==r.row&&this.column==r.column)return;var i={row:this.row,column:this.column};this.row=r.row,this.column=r.column,this._signal("change",{old:i,value:r})},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(e){this.document=e||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(e,t){var n={};return e>=this.document.getLength()?(n.row=Math.max(0,this.document.getLength()-1),n.column=this.document.getLine(n.row).length):e<0?(n.row=0,n.column=0):(n.row=e,n.column=Math.min(this.document.getLine(n.row).length,Math.max(0,t))),t<0&&(n.column=0),n}}).call(s.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(e,t,n){"use strict";var r=e("./lib/oop"),i=e("./apply_delta").applyDelta,s=e("./lib/event_emitter").EventEmitter,o=e("./range").Range,u=e("./anchor").Anchor,a=function(e){this.$lines=[""],e.length===0?this.$lines=[""]:Array.isArray(e)?this.insertMergedLines({row:0,column:0},e):this.insert({row:0,column:0},e)};(function(){r.implement(this,s),this.setValue=function(e){var t=this.getLength()-1;this.remove(new o(0,0,t,this.getLine(t).length)),this.insert({row:0,column:0},e)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(e,t){return new u(this,e,t)},"aaa".split(/a/).length===0?this.$split=function(e){return e.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(e){return e.split(/\r\n|\r|\n/)},this.$detectNewLine=function(e){var t=e.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=t?t[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(e){if(this.$newLineMode===e)return;this.$newLineMode=e,this._signal("changeNewLineMode")},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(e){return e=="\r\n"||e=="\r"||e=="\n"},this.getLine=function(e){return this.$lines[e]||""},this.getLines=function(e,t){return this.$lines.slice(e,t+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(e){return this.getLinesForRange(e).join(this.getNewLineCharacter())},this.getLinesForRange=function(e){var t;if(e.start.row===e.end.row)t=[this.getLine(e.start.row).substring(e.start.column,e.end.column)];else{t=this.getLines(e.start.row,e.end.row),t[0]=(t[0]||"").substring(e.start.column);var n=t.length-1;e.end.row-e.start.row==n&&(t[n]=t[n].substring(0,e.end.column))}return t},this.insertLines=function(e,t){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(e,t)},this.removeLines=function(e,t){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(e,t)},this.insertNewLine=function(e){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(e,["",""])},this.insert=function(e,t){return this.getLength()<=1&&this.$detectNewLine(t),this.insertMergedLines(e,this.$split(t))},this.insertInLine=function(e,t){var n=this.clippedPos(e.row,e.column),r=this.pos(e.row,e.column+t.length);return this.applyDelta({start:n,end:r,action:"insert",lines:[t]},!0),this.clonePos(r)},this.clippedPos=function(e,t){var n=this.getLength();e===undefined?e=n:e<0?e=0:e>=n&&(e=n-1,t=undefined);var r=this.getLine(e);return t==undefined&&(t=r.length),t=Math.min(Math.max(t,0),r.length),{row:e,column:t}},this.clonePos=function(e){return{row:e.row,column:e.column}},this.pos=function(e,t){return{row:e,column:t}},this.$clipPosition=function(e){var t=this.getLength();return e.row>=t?(e.row=Math.max(0,t-1),e.column=this.getLine(t-1).length):(e.row=Math.max(0,e.row),e.column=Math.min(Math.max(e.column,0),this.getLine(e.row).length)),e},this.insertFullLines=function(e,t){e=Math.min(Math.max(e,0),this.getLength());var n=0;e0,r=t=0&&this.applyDelta({start:this.pos(e,this.getLine(e).length),end:this.pos(e+1,0),action:"remove",lines:["",""]})},this.replace=function(e,t){e instanceof o||(e=o.fromPoints(e.start,e.end));if(t.length===0&&e.isEmpty())return e.start;if(t==this.getTextRange(e))return e.end;this.remove(e);var n;return t?n=this.insert(e.start,t):n=e.start,n},this.applyDeltas=function(e){for(var t=0;t=0;t--)this.revertDelta(e[t])},this.applyDelta=function(e,t){var n=e.action=="insert";if(n?e.lines.length<=1&&!e.lines[0]:!o.comparePoints(e.start,e.end))return;n&&e.lines.length>2e4&&this.$splitAndapplyLargeDelta(e,2e4),i(this.$lines,e,t),this._signal("change",e)},this.$splitAndapplyLargeDelta=function(e,t){var n=e.lines,r=n.length,i=e.start.row,s=e.start.column,o=0,u=0;do{o=u,u+=t-1;var a=n.slice(o,u);if(u>r){e.lines=a,e.start.row=i+o,e.start.column=s;break}a.push(""),this.applyDelta({start:this.pos(i+o,s),end:this.pos(i+u,s=0),action:e.action,lines:a},!0)}while(!0)},this.revertDelta=function(e){this.applyDelta({start:this.clonePos(e.start),end:this.clonePos(e.end),action:e.action=="insert"?"remove":"insert",lines:e.lines.slice()})},this.indexToPosition=function(e,t){var n=this.$lines||this.getAllLines(),r=this.getNewLineCharacter().length;for(var i=t||0,s=n.length;i0){t&1&&(n+=e);if(t>>=1)e+=e}return n};var r=/^\s\s*/,i=/\s\s*$/;t.stringTrimLeft=function(e){return e.replace(r,"")},t.stringTrimRight=function(e){return e.replace(i,"")},t.copyObject=function(e){var t={};for(var n in e)t[n]=e[n];return t},t.copyArray=function(e){var t=[];for(var n=0,r=e.length;n0&&this._events[e].length>n&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),typeof console.trace=="function"&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),n||(n=!0,t.apply(this,arguments))}if(!i(t))throw TypeError("listener must be a function");var n=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var n,r,s,u;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;n=this._events[e],s=n.length,r=-1;if(n===t||i(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(n)){for(u=s;u-->0;)if(n[u]===t||n[u].listener&&n[u].listener===t){r=u;break}if(r<0)return this;n.length===1?(n.length=0,delete this._events[e]):n.splice(r,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return arguments.length===0?this._events={}:this._events[e]&&delete this._events[e],this;if(arguments.length===0){for(t in this._events){if(t==="removeListener")continue;this.removeAllListeners(t)}return this.removeAllListeners("removeListener"),this._events={},this}n=this._events[e];if(i(n))this.removeListener(e,n);else while(n.length)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return!this._events||!this._events[e]?t=[]:i(this._events[e])?t=[this._events[e]]:t=this._events[e].slice(),t},r.listenerCount=function(e,t){var n;return!e._events||!e._events[t]?n=0:i(e._events[t])?n=1:n=e._events[t].length,n}},{}],"/node_modules/jshint/data/ascii-identifier-data.js":[function(e,t,n){var r=[];for(var i=0;i<128;i++)r[i]=i===36||i>=65&&i<=90||i===95||i>=97&&i<=122;var s=[];for(var i=0;i<128;i++)s[i]=r[i]||i>=48&&i<=57;t.exports={asciiIdentifierStartTable:r,asciiIdentifierPartTable:s}},{}],"/node_modules/jshint/lodash.js":[function(e,t,n){(function(e){(function(){function $(e,t,n){var r=e.length,i=n?r:-1;while(n?i--:++ir&&(r=i)}return r}function Dt(e,t){var n=-1,r=e.length;while(++ns?0:s+t),n=n===r||n>s?s:+n||0,n<0&&(n+=s),s=t>n?0:n-t>>>0,t>>>=0;var o=Array(s);while(++i>>1,o=e[s];(n?o<=t:o2&&n[i-2],o=i>2&&n[2],u=i>1&&n[i-1];typeof s=="function"?(s=on(s,u,5),i-=2):(s=typeof u=="function"?u:null,i-=s?1:0),o&&Tn(n[0],n[1],o)&&(s=i<3?null:s,i=1);while(++rf))return!1;while(c&&++a-1&&e%1==0&&e-1&&e%1==0&&e<=Nt}function kn(e){return e===e&&(e===0?1/e>0:!Jn(e))}function Ln(e){var t,n=Ct.support;if(!Y(e)||rt.call(e)!=d||!nt.call(e,"constructor")&&(t=e.constructor,typeof t=="function"&&!(t instanceof t)))return!1;var i;return Ut(e,function(e,t){i=t}),i===r||nt.call(e,i)}function An(e){var t=ir(e),n=t.length,r=n&&e.length,i=Ct.support,s=r&&Cn(r)&&(Xn(e)||i.nonEnumArgs&&Wn(e)),o=-1,u=[];while(++o>>0,r=Array(n);while(++t-1:gn(e,t,n)>-1):!1}function qn(e,t,n){var r=Xn(e)?Ot:qt;return t=mn(t,n,3),r(e,function(e,n,r){return!t(e,n,r)})}function Rn(e,t,n){var i=Xn(e)?Dt:tn;n&&Tn(e,t,n)&&(t=null);if(typeof t!="function"||n!==r)t=mn(t,n,3);return i(e,t)}function Un(e,t){if(typeof e!="function")throw new TypeError(s);return t=yt(t===r?e.length-1:+t||0,0),function(){var n=arguments,r=-1,i=yt(n.length-t,0),s=Array(i);while(++r0;while(++r>>1,Tt=dt?dt.BYTES_PER_ELEMENT:0,Nt=Math.pow(2,53)-1,kt=Ct.support={};(function(e){var t=function(){this.x=e},n={0:e,length:e},r=[];t.prototype={valueOf:e,y:e};for(var i in new t)r.push(i);kt.funcDecomp=/\bthis\b/.test(function(){return this}),kt.funcNames=typeof Function.name=="string";try{kt.nonEnumArgs=!ht.call(arguments,1)}catch(s){kt.nonEnumArgs=!0}})(1,0);var Ht=vt||function(e,t){return t==null?e:Bt(t,bn(t),Bt(t,rr(t),e))},It=fn(zt),Rt=ln();ot||(un=!st||!pt?fr(null):function(e){var t=e.byteLength,n=dt?ut(t/Tt):0,r=n*Tt,i=new st(t);if(n){var s=new dt(i,0,n);s.set(new dt(e,0,n))}return t!=r&&(s=new pt(i,r),s.set(new pt(e,r))),i});var yn=Yt("length"),bn=at?function(e){return at(On(e))}:fr([]),_n=cn(!0),jn=Un(Bn),Fn=hn(At,It),Xn=mt||function(e){return Y(e)&&Cn(e.length)&&rt.call(e)==u},$n=K(/x/)||pt&&!K(pt)?function(e){return rt.call(e)==c}:K,Gn=ft?function(e){if(!e||rt.call(e)!=d)return!1;var t=e.valueOf,n=Kn(t)&&(n=ft(t))&&ft(n);return n?e==n||ft(e)==n:Ln(e)}:Ln,tr=an(function(e,t,n){return n?Pt(e,t,n):Ht(e,t)}),rr=gt?function(e){if(e)var t=e.constructor,n=e.length;return typeof t=="function"&&t.prototype===e||typeof e!="function"&&Cn(n)?An(e):Jn(e)?gt(e):[]}:An,sr=an(Qt);Ct.assign=tr,Ct.callback=ar,Ct.constant=fr,Ct.forEach=Fn,Ct.keys=rr,Ct.keysIn=ir,Ct.merge=sr,Ct.property=cr,Ct.reject=qn,Ct.restParam=Un,Ct.slice=Hn,Ct.toPlainObject=er,Ct.unzip=Bn,Ct.values=or,Ct.zip=jn,Ct.each=Fn,Ct.extend=tr,Ct.iteratee=ar,Ct.clone=zn,Ct.escapeRegExp=ur,Ct.findLastIndex=_n,Ct.has=nr,Ct.identity=lr,Ct.includes=In,Ct.indexOf=Dn,Ct.isArguments=Wn,Ct.isArray=Xn,Ct.isEmpty=Vn,Ct.isFunction=$n,Ct.isNative=Kn,Ct.isNumber=Qn,Ct.isObject=Jn,Ct.isPlainObject=Gn,Ct.isString=Yn,Ct.isTypedArray=Zn,Ct.last=Pn,Ct.some=Rn,Ct.any=Rn,Ct.contains=In,Ct.include=In,Ct.VERSION=i,q&&R?X?(R.exports=Ct)._=Ct:q._=Ct:V._=Ct}).call(this)}).call(this,typeof global!="undefined"?global:typeof self!="undefined"?self:typeof window!="undefined"?window:{})},{}],"/node_modules/jshint/src/jshint.js":[function(e,t,n){var r=e("../lodash"),i=e("events"),s=e("./vars.js"),o=e("./messages.js"),u=e("./lex.js").Lexer,a=e("./reg.js"),f=e("./state.js").state,l=e("./style.js"),c=e("./options.js"),h=e("./scope-manager.js"),p=function(){"use strict";function k(e,t){return e=e.trim(),/^[+-]W\d{3}$/g.test(e)?!0:c.validNames.indexOf(e)===-1&&t.type!=="jslint"&&!r.has(c.removed,e)?(q("E001",t,e),!1):!0}function L(e){return Object.prototype.toString.call(e)==="[object String]"}function A(e,t){return e?!e.identifier||e.value!==t?!1:!0:!1}function O(e){if(!e.reserved)return!1;var t=e.meta;if(t&&t.isFutureReservedWord&&f.inES5()){if(!t.es5)return!1;if(t.strictOnly&&!f.option.strict&&!f.isStrict())return!1;if(e.isProperty)return!1}return!0}function M(e,t){return e.replace(/\{([^{}]*)\}/g,function(e,n){var r=t[n];return typeof r=="string"||typeof r=="number"?r:e})}function D(e,t){Object.keys(t).forEach(function(n){if(r.has(p.blacklist,n))return;e[n]=t[n]})}function P(){if(f.option.enforceall){for(var e in c.bool.enforcing)f.option[e]===undefined&&!c.noenforceall[e]&&(f.option[e]=!0);for(var t in c.bool.relaxing)f.option[t]===undefined&&(f.option[t]=!1)}}function H(){P(),!f.option.esversion&&!f.option.moz&&(f.option.es3?f.option.esversion=3:f.option.esnext?f.option.esversion=6:f.option.esversion=5),f.inES5()&&D(S,s.ecmaIdentifiers[5]),f.inES6()&&D(S,s.ecmaIdentifiers[6]),f.option.module&&(f.option.strict===!0&&(f.option.strict="global"),f.inES6()||F("W134",f.tokens.next,"module",6)),f.option.couch&&D(S,s.couch),f.option.qunit&&D(S,s.qunit),f.option.rhino&&D(S,s.rhino),f.option.shelljs&&(D(S,s.shelljs),D(S,s.node)),f.option.typed&&D(S,s.typed),f.option.phantom&&(D(S,s.phantom),f.option.strict===!0&&(f.option.strict="global")),f.option.prototypejs&&D(S,s.prototypejs),f.option.node&&(D(S,s.node),D(S,s.typed),f.option.strict===!0&&(f.option.strict="global")),f.option.devel&&D(S,s.devel),f.option.dojo&&D(S,s.dojo),f.option.browser&&(D(S,s.browser),D(S,s.typed)),f.option.browserify&&(D(S,s.browser),D(S,s.typed),D(S,s.browserify),f.option.strict===!0&&(f.option.strict="global")),f.option.nonstandard&&D(S,s.nonstandard),f.option.jasmine&&D(S,s.jasmine),f.option.jquery&&D(S,s.jquery),f.option.mootools&&D(S,s.mootools),f.option.worker&&D(S,s.worker),f.option.wsh&&D(S,s.wsh),f.option.globalstrict&&f.option.strict!==!1&&(f.option.strict="global"),f.option.yui&&D(S,s.yui),f.option.mocha&&D(S,s.mocha)}function B(e,t,n){var r=Math.floor(t/f.lines.length*100),i=o.errors[e].desc;throw{name:"JSHintError",line:t,character:n,message:i+" ("+r+"% scanned).",raw:i,code:e}}function j(){var e=f.ignoredLines;if(r.isEmpty(e))return;p.errors=r.reject(p.errors,function(t){return e[t.line]})}function F(e,t,n,r,i,s){var u,a,l,c;if(/^W\d{3}$/.test(e)){if(f.ignored[e])return;c=o.warnings[e]}else/E\d{3}/.test(e)?c=o.errors[e]:/I\d{3}/.test(e)&&(c=o.info[e]);return t=t||f.tokens.next||{},t.id==="(end)"&&(t=f.tokens.curr),a=t.line||0,u=t.from||0,l={id:"(error)",raw:c.desc,code:c.code,evidence:f.lines[a-1]||"",line:a,character:u,scope:p.scope,a:n,b:r,c:i,d:s},l.reason=M(c.desc,l),p.errors.push(l),j(),p.errors.length>=f.option.maxerr&&B("E043",a,u),l}function I(e,t,n,r,i,s,o){return F(e,{line:t,from:n},r,i,s,o)}function q(e,t,n,r,i,s){F(e,t,n,r,i,s)}function R(e,t,n,r,i,s,o){return q(e,{line:t,from:n},r,i,s,o)}function U(e,t){var n;return n={id:"(internal)",elem:e,value:t},p.internals.push(n),n}function z(){var e=f.tokens.next,t=e.body.match(/(-\s+)?[^\s,:]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g)||[],i={};if(e.type==="globals"){t.forEach(function(n,r){n=n.split(":");var s=(n[0]||"").trim(),o=(n[1]||"").trim();if(s==="-"||!s.length){if(r>0&&r===t.length-1)return;q("E002",e);return}s.charAt(0)==="-"?(s=s.slice(1),o=!1,p.blacklist[s]=s,delete S[s]):i[s]=o==="true"}),D(S,i);for(var s in i)r.has(i,s)&&(n[s]=e)}e.type==="exported"&&t.forEach(function(n,r){if(!n.length){if(r>0&&r===t.length-1)return;q("E002",e);return}f.funct["(scope)"].addExported(n)}),e.type==="members"&&(E=E||{},t.forEach(function(e){var t=e.charAt(0),n=e.charAt(e.length-1);t===n&&(t==='"'||t==="'")&&(e=e.substr(1,e.length-2).replace('\\"','"')),E[e]=!1}));var o=["maxstatements","maxparams","maxdepth","maxcomplexity","maxerr","maxlen","indent"];if(e.type==="jshint"||e.type==="jslint")t.forEach(function(t){t=t.split(":");var n=(t[0]||"").trim(),i=(t[1]||"").trim();if(!k(n,e))return;if(o.indexOf(n)>=0){if(i!=="false"){i=+i;if(typeof i!="number"||!isFinite(i)||i<=0||Math.floor(i)!==i){q("E032",e,t[1].trim());return}f.option[n]=i}else f.option[n]=n==="indent"?4:!1;return}if(n==="validthis"){if(f.funct["(global)"])return void q("E009");if(i!=="true"&&i!=="false")return void q("E002",e);f.option.validthis=i==="true";return}if(n==="quotmark"){switch(i){case"true":case"false":f.option.quotmark=i==="true";break;case"double":case"single":f.option.quotmark=i;break;default:q("E002",e)}return}if(n==="shadow"){switch(i){case"true":f.option.shadow=!0;break;case"outer":f.option.shadow="outer";break;case"false":case"inner":f.option.shadow="inner";break;default:q("E002",e)}return}if(n==="unused"){switch(i){case"true":f.option.unused=!0;break;case"false":f.option.unused=!1;break;case"vars":case"strict":f.option.unused=i;break;default:q("E002",e)}return}if(n==="latedef"){switch(i){case"true":f.option.latedef=!0;break;case"false":f.option.latedef=!1;break;case"nofunc":f.option.latedef="nofunc";break;default:q("E002",e)}return}if(n==="ignore"){switch(i){case"line":f.ignoredLines[e.line]=!0,j();break;default:q("E002",e)}return}if(n==="strict"){switch(i){case"true":f.option.strict=!0;break;case"false":f.option.strict=!1;break;case"func":case"global":case"implied":f.option.strict=i;break;default:q("E002",e)}return}n==="module"&&(zt(f.funct)||q("E055",f.tokens.next,"module"));var s={es3:3,es5:5,esnext:6};if(r.has(s,n)){switch(i){case"true":f.option.moz=!1,f.option.esversion=s[n];break;case"false":f.option.moz||(f.option.esversion=5);break;default:q("E002",e)}return}if(n==="esversion"){switch(i){case"5":f.inES5(!0)&&F("I003");case"3":case"6":f.option.moz=!1,f.option.esversion=+i;break;case"2015":f.option.moz=!1,f.option.esversion=6;break;default:q("E002",e)}zt(f.funct)||q("E055",f.tokens.next,"esversion");return}var u=/^([+-])(W\d{3})$/g.exec(n);if(u){f.ignored[u[2]]=u[1]==="-";return}var a;if(i==="true"||i==="false"){e.type==="jslint"?(a=c.renamed[n]||n,f.option[a]=i==="true",c.inverted[a]!==undefined&&(f.option[a]=!f.option[a])):f.option[n]=i==="true",n==="newcap"&&(f.option["(explicitNewcap)"]=!0);return}q("E002",e)}),H()}function W(e){var t=e||0,n=y.length,r;if(t="a"&&t<="z"||t>="A"&&t<="Z")e.identifier=e.reserved=!0;return e}function ut(e,t){var n=nt(e,150);return ot(n),n.nud=typeof t=="function"?t:function(){this.arity="unary",this.right=Q(150);if(this.id==="++"||this.id==="--")f.option.plusplus?F("W016",this,this.id):this.right&&(!this.right.identifier||O(this.right))&&this.right.id!=="."&&this.right.id!=="["&&F("W017",this),this.right&&this.right.isMetaProperty?q("E031",this):this.right&&this.right.identifier&&f.funct["(scope)"].block.modify(this.right.value,this);return this},n}function at(e,t){var n=rt(e);return n.type=e,n.nud=t,n}function ft(e,t){var n=at(e,t);return n.identifier=!0,n.reserved=!0,n}function lt(e,t){var n=at(e,t&&t.nud||function(){return this});return t=t||{},t.isFutureReservedWord=!0,n.value=e,n.identifier=!0,n.reserved=!0,n.meta=t,n}function ct(e,t){return ft(e,function(){return typeof t=="function"&&t(this),this})}function ht(e,t,n,r){var i=nt(e,n);return ot(i),i.infix=!0,i.led=function(i){return r||Y(f.tokens.prev,f.tokens.curr),(e==="in"||e==="instanceof")&&i.id==="!"&&F("W018",i,"!"),typeof t=="function"?t(i,this):(this.left=i,this.right=Q(n),this)},i}function pt(e){var t=nt(e,42);return t.led=function(e){return Y(f.tokens.prev,f.tokens.curr),this.left=e,this.right=Xt({type:"arrow",loneArg:e}),this},t}function dt(e,t){var n=nt(e,100);return n.led=function(e){Y(f.tokens.prev,f.tokens.curr),this.left=e;var n=this.right=Q(100);return A(e,"NaN")||A(n,"NaN")?F("W019",this):t&&t.apply(this,[e,n]),(!e||!n)&&B("E041",f.tokens.curr.line),e.id==="!"&&F("W018",e,"!"),n.id==="!"&&F("W018",n,"!"),this},n}function vt(e){return e&&(e.type==="(number)"&&+e.value===0||e.type==="(string)"&&e.value===""||e.type==="null"&&!f.option.eqnull||e.type==="true"||e.type==="false"||e.type==="undefined")}function gt(e,t,n){var i;return n.option.notypeof?!1:!e||!t?!1:(i=n.inES6()?mt.es6:mt.es3,t.type==="(identifier)"&&t.value==="typeof"&&e.type==="(string)"?!r.contains(i,e.value):!1)}function yt(e,t){var n=!1;return e.type==="this"&&t.funct["(context)"]===null?n=!0:e.type==="(identifier)"&&(t.option.node&&e.value==="global"?n=!0:t.option.browser&&(e.value==="window"||e.value==="document")&&(n=!0)),n}function bt(e){function n(e){if(typeof e!="object")return;return e.right==="prototype"?e:n(e.left)}function r(e){while(!e.identifier&&typeof e.left=="object")e=e.left;if(e.identifier&&t.indexOf(e.value)>=0)return e.value}var t=["Array","ArrayBuffer","Boolean","Collator","DataView","Date","DateTimeFormat","Error","EvalError","Float32Array","Float64Array","Function","Infinity","Intl","Int16Array","Int32Array","Int8Array","Iterator","Number","NumberFormat","Object","RangeError","ReferenceError","RegExp","StopIteration","String","SyntaxError","TypeError","Uint16Array","Uint32Array","Uint8Array","Uint8ClampedArray","URIError"],i=n(e);if(i)return r(i)}function wt(e,t,n){var r=n&&n.allowDestructuring;t=t||e;if(f.option.freeze){var i=bt(e);i&&F("W121",e,i)}return e.identifier&&!e.isMetaProperty&&f.funct["(scope)"].block.reassign(e.value,e),e.id==="."?((!e.left||e.left.value==="arguments"&&!f.isStrict())&&F("E031",t),f.nameStack.set(f.tokens.prev),!0):e.id==="{"||e.id==="["?(r&&f.tokens.curr.left.destructAssign?f.tokens.curr.left.destructAssign.forEach(function(e){e.id&&f.funct["(scope)"].block.modify(e.id,e.token)}):e.id==="{"||!e.left?F("E031",t):e.left.value==="arguments"&&!f.isStrict()&&F("E031",t),e.id==="["&&f.nameStack.set(e.right),!0):e.isMetaProperty?(q("E031",t),!0):e.identifier&&!O(e)?(f.funct["(scope)"].labeltype(e.value)==="exception"&&F("W022",e),f.nameStack.set(e),!0):(e===f.syntax["function"]&&F("W023",f.tokens.curr),!1)}function Et(e,t,n){var r=ht(e,typeof t=="function"?t:function(e,t){t.left=e;if(e&&wt(e,t,{allowDestructuring:!0}))return t.right=Q(10),t;q("E031",t)},n);return r.exps=!0,r.assign=!0,r}function St(e,t,n){var r=nt(e,n);return ot(r),r.led=typeof t=="function"?t:function(e){return f.option.bitwise&&F("W016",this,this.id),this.left=e,this.right=Q(n),this},r}function xt(e){return Et(e,function(e,t){f.option.bitwise&&F("W016",t,t.id);if(e&&wt(e,t))return t.right=Q(10),t;q("E031",t)},20)}function Tt(e){var t=nt(e,150);return t.led=function(e){return f.option.plusplus?F("W016",this,this.id):(!e.identifier||O(e))&&e.id!=="."&&e.id!=="["&&F("W017",this),e.isMetaProperty?q("E031",this):e&&e.identifier&&f.funct["(scope)"].block.modify(e.value,e),this.left=e,this},t}function Nt(e,t,n){if(!f.tokens.next.identifier)return;n||V();var r=f.tokens.curr,i=f.tokens.curr.value;return O(r)?t&&f.inES5()?i:e&&i==="undefined"?i:(F("W024",f.tokens.curr,f.tokens.curr.id),i):i}function Ct(e,t){var n=Nt(e,t,!1);if(n)return n;if(f.tokens.next.value==="..."){f.inES6(!0)||F("W119",f.tokens.next,"spread/rest operator","6"),V();if(pn(f.tokens.next,"...")){F("E024",f.tokens.next,"...");while(pn(f.tokens.next,"..."))V()}if(!f.tokens.next.identifier){F("E024",f.tokens.curr,"...");return}return Ct(e,t)}q("E030",f.tokens.next,f.tokens.next.value),f.tokens.next.id!==";"&&V()}function kt(e){var t=0,n;if(f.tokens.next.id!==";"||e.inBracelessBlock)return;for(;;){do n=W(t),t+=1;while(n.id!=="(end)"&&n.id==="(comment)");if(n.reach)return;if(n.id!=="(endline)"){if(n.id==="function"){f.option.latedef===!0&&F("W026",n);break}F("W027",n,n.value,e.value);break}}}function Lt(){if(f.tokens.next.id!==";"){if(f.tokens.next.isUnclosed)return V();var e=G(f.tokens.next)===f.tokens.curr.line&&f.tokens.next.id!=="(end)",t=pn(f.tokens.next,"}");e&&!t?R("E058",f.tokens.curr.line,f.tokens.curr.character):f.option.asi||(t&&!f.option.lastsemic||!e)&&I("W033",f.tokens.curr.line,f.tokens.curr.character)}else V(";")}function At(){var e=g,t,n=f.tokens.next,r=!1;if(n.id===";"){V(";");return}var i=O(n);i&&n.meta&&n.meta.isFutureReservedWord&&W().id===":"&&(F("W024",n,n.id),i=!1),n.identifier&&!i&&W().id===":"&&(V(),V(":"),r=!0,f.funct["(scope)"].stack(),f.funct["(scope)"].block.addBreakLabel(n.value,{token:f.tokens.curr}),!f.tokens.next.labelled&&f.tokens.next.value!=="{"&&F("W028",f.tokens.next,n.value,f.tokens.next.value),f.tokens.next.label=n.value,n=f.tokens.next);if(n.id==="{"){var s=f.funct["(verb)"]==="case"&&f.tokens.curr.value===":";_t(!0,!0,!1,!1,s);return}return t=Q(0,!0),t&&(!t.identifier||t.value!=="function")&&(t.type!=="(punctuator)"||!t.left||!t.left.identifier||t.left.value!=="function")&&!f.isStrict()&&f.option.strict==="global"&&F("E007"),n.block||(!f.option.expr&&(!t||!t.exps)?F("W030",f.tokens.curr):f.option.nonew&&t&&t.left&&t.id==="("&&t.left.id==="new"&&F("W031",n),Lt()),g=e,r&&f.funct["(scope)"].unstack(),t}function Ot(){var e=[],t;while(!f.tokens.next.reach&&f.tokens.next.id!=="(end)")f.tokens.next.id===";"?(t=W(),(!t||t.id!=="("&&t.id!=="[")&&F("W032"),V(";")):e.push(At());return e}function Mt(){var e,t,n;while(f.tokens.next.id==="(string)"){t=W(0);if(t.id==="(endline)"){e=1;do n=W(e++);while(n.id==="(endline)");if(n.id===";")t=n;else{if(n.value==="["||n.value===".")break;(!f.option.asi||n.value==="(")&&F("W033",f.tokens.next)}}else{if(t.id==="."||t.id==="[")break;t.id!==";"&&F("W033",t)}V();var r=f.tokens.curr.value;(f.directive[r]||r==="use strict"&&f.option.strict==="implied")&&F("W034",f.tokens.curr,r),f.directive[r]=!0,t.id===";"&&V(";")}f.isStrict()&&(f.option["(explicitNewcap)"]||(f.option.newcap=!0),f.option.undef=!0)}function _t(e,t,n,i,s){var o,u=m,a=g,l,c,h,p;m=e,c=f.tokens.next;var d=f.funct["(metrics)"];d.nestedBlockDepth+=1,d.verifyMaxNestedBlockDepthPerFunction();if(f.tokens.next.id==="{"){V("{"),f.funct["(scope)"].stack(),h=f.tokens.curr.line;if(f.tokens.next.id!=="}"){g+=f.option.indent;while(!e&&f.tokens.next.from>g)g+=f.option.indent;if(n){l={};for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Mt(),f.option.strict&&f.funct["(context)"]["(global)"]&&!l["use strict"]&&!f.isStrict()&&F("E007")}o=Ot(),d.statementCount+=o.length,g-=f.option.indent}V("}",c),n&&(f.funct["(scope)"].validateParams(),l&&(f.directive=l)),f.funct["(scope)"].unstack(),g=a}else if(!e)if(n){f.funct["(scope)"].stack(),l={},t&&!i&&!f.inMoz()&&q("W118",f.tokens.curr,"function closure expressions");if(!t)for(p in f.directive)r.has(f.directive,p)&&(l[p]=f.directive[p]);Q(10),f.option.strict&&f.funct["(context)"]["(global)"]&&!l["use strict"]&&!f.isStrict()&&F("E007"),f.funct["(scope)"].unstack()}else q("E021",f.tokens.next,"{",f.tokens.next.value);else f.funct["(noblockscopedvar)"]=f.tokens.next.id!=="for",f.funct["(scope)"].stack(),(!t||f.option.curly)&&F("W116",f.tokens.next,"{",f.tokens.next.value),f.tokens.next.inBracelessBlock=!0,g+=f.option.indent,o=[At()],g-=f.option.indent,f.funct["(scope)"].unstack(),delete f.funct["(noblockscopedvar)"];switch(f.funct["(verb)"]){case"break":case"continue":case"return":case"throw":if(s)break;default:f.funct["(verb)"]=null}return m=u,e&&f.option.noempty&&(!o||o.length===0)&&F("W035",f.tokens.prev),d.nestedBlockDepth-=1,o}function Dt(e){E&&typeof E[e]!="boolean"&&F("W036",f.tokens.curr,e),typeof w[e]=="number"?w[e]+=1:w[e]=1}function Bt(){var e={};e.exps=!0,f.funct["(comparray)"].stack();var t=!1;return f.tokens.next.value!=="for"&&(t=!0,f.inMoz()||F("W116",f.tokens.next,"for",f.tokens.next.value),f.funct["(comparray)"].setState("use"),e.right=Q(10)),V("for"),f.tokens.next.value==="each"&&(V("each"),f.inMoz()||F("W118",f.tokens.curr,"for each")),V("("),f.funct["(comparray)"].setState("define"),e.left=Q(130),r.contains(["in","of"],f.tokens.next.value)?V():q("E045",f.tokens.curr),f.funct["(comparray)"].setState("generate"),Q(10),V(")"),f.tokens.next.value==="if"&&(V("if"),V("("),f.funct["(comparray)"].setState("filter"),e.filter=Q(10),V(")")),t||(f.funct["(comparray)"].setState("use"),e.right=Q(10)),V("]"),f.funct["(comparray)"].unstack(),e}function jt(){return f.funct["(statement)"]&&f.funct["(statement)"].type==="class"||f.funct["(context)"]&&f.funct["(context)"]["(verb)"]==="class"}function Ft(e){return e.identifier||e.id==="(string)"||e.id==="(number)"}function It(e){var t,n=!0;return typeof e=="object"?t=e:(n=e,t=Nt(!1,!0,n)),t?typeof t=="object"&&(t.id==="(string)"||t.id==="(identifier)"?t=t.value:t.id==="(number)"&&(t=t.value.toString())):f.tokens.next.id==="(string)"?(t=f.tokens.next.value,n||V()):f.tokens.next.id==="(number)"&&(t=f.tokens.next.value.toString(),n||V()),t==="hasOwnProperty"&&F("W001"),t}function qt(e){function h(e){f.funct["(scope)"].addParam.apply(f.funct["(scope)"],e)}var t,n=[],i,s=[],o,u=!1,a=!1,l=0,c=e&&e.loneArg;if(c&&c.identifier===!0)return f.funct["(scope)"].addParam(c.value,c),{arity:1,params:[c.value]};t=f.tokens.next,(!e||!e.parsedOpening)&&V("(");if(f.tokens.next.id===")"){V(")");return}for(;;){l++;var p=[];if(r.contains(["{","["],f.tokens.next.id)){s=Gt();for(o in s)o=s[o],o.id&&(n.push(o.id),p.push([o.id,o.token]))}else{pn(f.tokens.next,"...")&&(a=!0),i=Ct(!0);if(i)n.push(i),p.push([i,f.tokens.curr]);else while(!hn(f.tokens.next,[",",")"]))V()}u&&f.tokens.next.id!=="="&&q("W138",f.tokens.current),f.tokens.next.id==="="&&(f.inES6()||F("W119",f.tokens.next,"default parameters","6"),V("="),u=!0,Q(10)),p.forEach(h);if(f.tokens.next.id!==",")return V(")",t),{arity:l,params:n};a&&F("W131",f.tokens.next),tt()}}function Rt(e,t,n){var i={"(name)":e,"(breakage)":0,"(loopage)":0,"(tokens)":{},"(properties)":{},"(catch)":!1,"(global)":!1,"(line)":null,"(character)":null,"(metrics)":null,"(statement)":null,"(context)":null,"(scope)":null,"(comparray)":null,"(generator)":null,"(arrow)":null,"(params)":null};return t&&r.extend(i,{"(line)":t.line,"(character)":t.character,"(metrics)":Vt(t)}),r.extend(i,n),i["(context)"]&&(i["(scope)"]=i["(context)"]["(scope)"],i["(comparray)"]=i["(context)"]["(comparray)"]),i}function Ut(e){return"(scope)"in e}function zt(e){return e["(global)"]&&!e["(verb)"]}function Wt(e){function i(){if(f.tokens.curr.template&&f.tokens.curr.tail&&f.tokens.curr.context===t)return!0;var e=f.tokens.next.template&&f.tokens.next.tail&&f.tokens.next.context===t;return e&&V(),e||f.tokens.next.isUnclosed}var t=this.context,n=this.noSubst,r=this.depth;if(!n)while(!i())!f.tokens.next.template||f.tokens.next.depth>r?Q(0):V();return{id:"(template)",type:"(template)",tag:e}}function Xt(e){var t,n,r,i,s,o,u,a,l=f.option,c=f.ignored;e&&(r=e.name,i=e.statement,s=e.classExprBinding,o=e.type==="generator",u=e.type==="arrow",a=e.ignoreLoopFunc),f.option=Object.create(f.option),f.ignored=Object.create(f.ignored),f.funct=Rt(r||f.nameStack.infer(),f.tokens.next,{"(statement)":i,"(context)":f.funct,"(arrow)":u,"(generator)":o}),t=f.funct,n=f.tokens.curr,n.funct=f.funct,v.push(f.funct),f.funct["(scope)"].stack("functionouter");var h=r||s;h&&f.funct["(scope)"].block.add(h,s?"class":"function",f.tokens.curr,!1),f.funct["(scope)"].stack("functionparams");var p=qt(e);return p?(f.funct["(params)"]=p.params,f.funct["(metrics)"].arity=p.arity,f.funct["(metrics)"].verifyMaxParametersPerFunction()):f.funct["(metrics)"].arity=0,u&&(f.inES6(!0)||F("W119",f.tokens.curr,"arrow function syntax (=>)","6"),e.loneArg||V("=>")),_t(!1,!0,!0,u),!f.option.noyield&&o&&f.funct["(generator)"]!=="yielded"&&F("W124",f.tokens.curr),f.funct["(metrics)"].verifyMaxStatementsPerFunction(),f.funct["(metrics)"].verifyMaxComplexityPerFunction(),f.funct["(unusedOption)"]=f.option.unused,f.option=l,f.ignored=c,f.funct["(last)"]=f.tokens.curr.line,f.funct["(lastcharacter)"]=f.tokens.curr.character,f.funct["(scope)"].unstack(),f.funct["(scope)"].unstack(),f.funct=f.funct["(context)"],!a&&!f.option.loopfunc&&f.funct["(loopage)"]&&t["(isCapturing)"]&&F("W083",n),t}function Vt(e){return{statementCount:0,nestedBlockDepth:-1,ComplexityCount:1,arity:0,verifyMaxStatementsPerFunction:function(){f.option.maxstatements&&this.statementCount>f.option.maxstatements&&F("W071",e,this.statementCount)},verifyMaxParametersPerFunction:function(){r.isNumber(f.option.maxparams)&&this.arity>f.option.maxparams&&F("W072",e,this.arity)},verifyMaxNestedBlockDepthPerFunction:function(){f.option.maxdepth&&this.nestedBlockDepth>0&&this.nestedBlockDepth===f.option.maxdepth+1&&F("W073",null,this.nestedBlockDepth)},verifyMaxComplexityPerFunction:function(){var t=f.option.maxcomplexity,n=this.ComplexityCount;t&&n>t&&F("W074",e,n)}}}function $t(){f.funct["(metrics)"].ComplexityCount+=1}function Jt(e){var t,n;e&&(t=e.id,n=e.paren,t===","&&(e=e.exprs[e.exprs.length-1])&&(t=e.id,n=n||e.paren));switch(t){case"=":case"+=":case"-=":case"*=":case"%=":case"&=":case"|=":case"^=":case"/=":!n&&!f.option.boss&&F("W084")}}function Kt(e){if(f.inES5())for(var t in e)e[t]&&e[t].setterToken&&!e[t].getterToken&&F("W078",e[t].setterToken)}function Qt(e,t){if(pn(f.tokens.next,".")){var n=f.tokens.curr.id;V(".");var r=Ct();return f.tokens.curr.isMetaProperty=!0,e!==r?q("E057",f.tokens.prev,n,r):t(),f.tokens.curr}}function Gt(e){var t=e&&e.assignment;return f.inES6()||F("W104",f.tokens.curr,t?"destructuring assignment":"destructuring binding","6"),Yt(e)}function Yt(e){var t,n=[],r=e&&e.openingParsed,i=e&&e.assignment,s=i?{assignment:i}:null,o=r?f.tokens.curr:f.tokens.next,u=function(){var e;if(hn(f.tokens.next,["[","{"])){t=Yt(s);for(var r in t)r=t[r],n.push({id:r.id,token:r.token})}else if(pn(f.tokens.next,","))n.push({id:null,token:f.tokens.curr});else{if(!pn(f.tokens.next,"(")){var o=pn(f.tokens.next,"...");if(i){var a=o?W(0):f.tokens.next;a.identifier||F("E030",a,a.value);var l=Q(155);l&&(wt(l),l.identifier&&(e=l.value))}else e=Ct();return e&&n.push({id:e,token:f.tokens.curr}),o}V("("),u(),V(")")}return!1},a=function(){var e;pn(f.tokens.next,"[")?(V("["),Q(10),V("]"),V(":"),u()):f.tokens.next.id==="(string)"||f.tokens.next.id==="(number)"?(V(),V(":"),u()):(e=Ct(),pn(f.tokens.next,":")?(V(":"),u()):e&&(i&&wt(f.tokens.curr),n.push({id:e,token:f.tokens.curr})))};if(pn(o,"[")){r||V("["),pn(f.tokens.next,"]")&&F("W137",f.tokens.curr);var l=!1;while(!pn(f.tokens.next,"]"))u()&&!l&&pn(f.tokens.next,",")&&(F("W130",f.tokens.next),l=!0),pn(f.tokens.next,"=")&&(pn(f.tokens.prev,"...")?V("]"):V("="),f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),Q(10)),pn(f.tokens.next,"]")||V(",");V("]")}else if(pn(o,"{")){r||V("{"),pn(f.tokens.next,"}")&&F("W137",f.tokens.curr);while(!pn(f.tokens.next,"}")){a(),pn(f.tokens.next,"=")&&(V("="),f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),Q(10));if(!pn(f.tokens.next,"}")){V(",");if(pn(f.tokens.next,"}"))break}}V("}")}return n}function Zt(e,t){var n=t.first;if(!n)return;r.zip(e,Array.isArray(n)?n:[n]).forEach(function(e){var t=e[0],n=e[1];t&&n?t.first=n:t&&t.first&&!n&&F("W080",t.first,t.first.value)})}function en(e,t,n){var i=n&&n.prefix,s=n&&n.inexport,o=e==="let",u=e==="const",a,l,c,h;f.inES6()||F("W104",f.tokens.curr,e,"6"),o&&f.tokens.next.value==="("?(f.inMoz()||F("W118",f.tokens.next,"let block"),V("("),f.funct["(scope)"].stack(),h=!0):f.funct["(noblockscopedvar)"]&&q("E048",f.tokens.curr,u?"Const":"Let"),t.first=[];for(;;){var p=[];r.contains(["{","["],f.tokens.next.value)?(a=Gt(),l=!1):(a=[{id:Ct(),token:f.tokens.curr}],l=!0),!i&&u&&f.tokens.next.id!=="="&&F("E012",f.tokens.curr,f.tokens.curr.value);for(var d in a)a.hasOwnProperty(d)&&(d=a[d],f.funct["(scope)"].block.isGlobal()&&S[d.id]===!1&&F("W079",d.token,d.id),d.id&&!f.funct["(noblockscopedvar)"]&&(f.funct["(scope)"].addlabel(d.id,{type:e,token:d.token}),p.push(d.token),l&&s&&f.funct["(scope)"].setExported(d.token.value,d.token)));f.tokens.next.id==="="&&(V("="),!i&&f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),!i&&W(0).id==="="&&f.tokens.next.identifier&&F("W120",f.tokens.next,f.tokens.next.value),c=Q(i?120:10),l?a[0].first=c:Zt(p,c)),t.first=t.first.concat(p);if(f.tokens.next.id!==",")break;tt()}return h&&(V(")"),_t(!0,!0),t.block=!0,f.funct["(scope)"].unstack()),t}function sn(e){return f.inES6()||F("W104",f.tokens.curr,"class","6"),e?(this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"class",token:f.tokens.curr})):f.tokens.next.identifier&&f.tokens.next.value!=="extends"?(this.name=Ct(),this.namedExpr=!0):this.name=f.nameStack.infer(),on(this),this}function on(e){var t=f.inClassBody;f.tokens.next.value==="extends"&&(V("extends"),e.heritage=Q(10)),f.inClassBody=!0,V("{"),e.body=un(e),V("}"),f.inClassBody=t}function un(e){var t,n,r,i,s=Object.create(null),o=Object.create(null),u;for(var a=0;f.tokens.next.id!=="}";++a){t=f.tokens.next,n=!1,r=!1,i=null;if(t.id===";"){F("W032"),V(";");continue}t.id==="*"&&(r=!0,V("*"),t=f.tokens.next);if(t.id==="[")t=cn(),u=!0;else{if(!Ft(t)){F("W052",f.tokens.next,f.tokens.next.value||f.tokens.next.type),V();continue}V(),u=!1;if(t.identifier&&t.value==="static"){pn(f.tokens.next,"*")&&(r=!0,V("*"));if(Ft(f.tokens.next)||f.tokens.next.id==="[")u=f.tokens.next.id==="[",n=!0,t=f.tokens.next,f.tokens.next.id==="["?t=cn():V()}t.identifier&&(t.value==="get"||t.value==="set")&&(Ft(f.tokens.next)||f.tokens.next.id==="[")&&(u=f.tokens.next.id==="[",i=t,t=f.tokens.next,f.tokens.next.id==="["?t=cn():V())}if(!pn(f.tokens.next,"(")){q("E054",f.tokens.next,f.tokens.next.value);while(f.tokens.next.id!=="}"&&!pn(f.tokens.next,"("))V();f.tokens.next.value!=="("&&Xt({statement:e})}u||(i?ln(i.value,n?o:s,t.value,t,!0,n):(t.value==="constructor"?f.nameStack.set(e):f.nameStack.set(t),fn(n?o:s,t.value,t,!0,n)));if(i&&t.value==="constructor"){var l=i.value==="get"?"class getter method":"class setter method";q("E049",t,l,"constructor")}else t.value==="prototype"&&q("E049",t,"class method","prototype");It(t),Xt({statement:e,type:r?"generator":null,classExprBinding:e.namedExpr?e.name:null})}Kt(s)}function fn(e,t,n,r,i){var s=["key","class method","static class method"];s=s[(r||!1)+(i||!1)],n.identifier&&(t=n.value),e[t]&&t!=="__proto__"?F("W075",f.tokens.next,s,t):e[t]=Object.create(null),e[t].basic=!0,e[t].basictkn=n}function ln(e,t,n,r,i,s){var o=e==="get"?"getterToken":"setterToken",u="";i?(s&&(u+="static "),u+=e+"ter method"):u="key",f.tokens.curr.accessorType=e,f.nameStack.set(r),t[n]?(t[n].basic||t[n][o])&&n!=="__proto__"&&F("W075",f.tokens.next,u,n):t[n]=Object.create(null),t[n][o]=r}function cn(){V("["),f.inES6()||F("W119",f.tokens.curr,"computed property names","6");var e=Q(10);return V("]"),e}function hn(e,t){return e.type==="(punctuator)"?r.contains(t,e.value):!1}function pn(e,t){return e.type==="(punctuator)"&&e.value===t}function dn(){var e=an();e.notJson?(!f.inES6()&&e.isDestAssign&&F("W104",f.tokens.curr,"destructuring assignment","6"),Ot()):(f.option.laxbreak=!0,f.jsonMode=!0,mn())}function mn(){function e(){var e={},t=f.tokens.next;V("{");if(f.tokens.next.id!=="}")for(;;){if(f.tokens.next.id==="(end)")q("E026",f.tokens.next,t.line);else{if(f.tokens.next.id==="}"){F("W094",f.tokens.curr);break}f.tokens.next.id===","?q("E028",f.tokens.next):f.tokens.next.id!=="(string)"&&F("W095",f.tokens.next,f.tokens.next.value)}e[f.tokens.next.value]===!0?F("W075",f.tokens.next,"key",f.tokens.next.value):f.tokens.next.value==="__proto__"&&!f.option.proto||f.tokens.next.value==="__iterator__"&&!f.option.iterator?F("W096",f.tokens.next,f.tokens.next.value):e[f.tokens.next.value]=!0,V(),V(":"),mn();if(f.tokens.next.id!==",")break;V(",")}V("}")}function t(){var e=f.tokens.next;V("[");if(f.tokens.next.id!=="]")for(;;){if(f.tokens.next.id==="(end)")q("E027",f.tokens.next,e.line);else{if(f.tokens.next.id==="]"){F("W094",f.tokens.curr);break}f.tokens.next.id===","&&q("E028",f.tokens.next)}mn();if(f.tokens.next.id!==",")break;V(",")}V("]")}switch(f.tokens.next.id){case"{":e();break;case"[":t();break;case"true":case"false":case"null":case"(number)":case"(string)":V();break;case"-":V("-"),V("(number)");break;default:q("E003",f.tokens.next)}}var e,t={"<":!0,"<=":!0,"==":!0,"===":!0,"!==":!0,"!=":!0,">":!0,">=":!0,"+":!0,"-":!0,"*":!0,"/":!0,"%":!0},n,d=["closure","exception","global","label","outer","unused","var"],v,m,g,y,b,w,E,S,x,T,N=[],C=new i.EventEmitter,mt={};mt.legacy=["xml","unknown"],mt.es3=["undefined","boolean","number","string","function","object"],mt.es3=mt.es3.concat(mt.legacy),mt.es6=mt.es3.concat("symbol"),at("(number)",function(){return this}),at("(string)",function(){return this}),f.syntax["(identifier)"]={type:"(identifier)",lbp:0,identifier:!0,nud:function(){var e=this.value;return f.tokens.next.id==="=>"?this:(f.funct["(comparray)"].check(e)||f.funct["(scope)"].block.use(e,f.tokens.curr),this)},led:function(){q("E033",f.tokens.next,f.tokens.next.value)}};var Pt={lbp:0,identifier:!1,template:!0};f.syntax["(template)"]=r.extend({type:"(template)",nud:Wt,led:Wt,noSubst:!1},Pt),f.syntax["(template middle)"]=r.extend({type:"(template middle)",middle:!0,noSubst:!1},Pt),f.syntax["(template tail)"]=r.extend({type:"(template tail)",tail:!0,noSubst:!1},Pt),f.syntax["(no subst template)"]=r.extend({type:"(template)",nud:Wt,led:Wt,noSubst:!0,tail:!0},Pt),at("(regexp)",function(){return this}),rt("(endline)"),rt("(begin)"),rt("(end)").reach=!0,rt("(error)").reach=!0,rt("}").reach=!0,rt(")"),rt("]"),rt('"').reach=!0,rt("'").reach=!0,rt(";"),rt(":").reach=!0,rt("#"),ft("else"),ft("case").reach=!0,ft("catch"),ft("default").reach=!0,ft("finally"),ct("arguments",function(e){f.isStrict()&&f.funct["(global)"]&&F("E008",e)}),ct("eval"),ct("false"),ct("Infinity"),ct("null"),ct("this",function(e){f.isStrict()&&!jt()&&!f.option.validthis&&(f.funct["(statement)"]&&f.funct["(name)"].charAt(0)>"Z"||f.funct["(global)"])&&F("W040",e)}),ct("true"),ct("undefined"),Et("=","assign",20),Et("+=","assignadd",20),Et("-=","assignsub",20),Et("*=","assignmult",20),Et("/=","assigndiv",20).nud=function(){q("E014")},Et("%=","assignmod",20),xt("&="),xt("|="),xt("^="),xt("<<="),xt(">>="),xt(">>>="),ht(",",function(e,t){var n;t.exprs=[e],f.option.nocomma&&F("W127");if(!tt({peek:!0}))return t;for(;;){if(!(n=Q(10)))break;t.exprs.push(n);if(f.tokens.next.value!==","||!tt())break}return t},10,!0),ht("?",function(e,t){return $t(),t.left=e,t.right=Q(10),V(":"),t["else"]=Q(10),t},30);var Ht=40;ht("||",function(e,t){return $t(),t.left=e,t.right=Q(Ht),t},Ht),ht("&&","and",50),St("|","bitor",70),St("^","bitxor",80),St("&","bitand",90),dt("==",function(e,t){var n=f.option.eqnull&&((e&&e.value)==="null"||(t&&t.value)==="null");switch(!0){case!n&&f.option.eqeqeq:this.from=this.character,F("W116",this,"===","==");break;case vt(e):F("W041",this,"===",e.value);break;case vt(t):F("W041",this,"===",t.value);break;case gt(t,e,f):F("W122",this,t.value);break;case gt(e,t,f):F("W122",this,e.value)}return this}),dt("===",function(e,t){return gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("!=",function(e,t){var n=f.option.eqnull&&((e&&e.value)==="null"||(t&&t.value)==="null");return!n&&f.option.eqeqeq?(this.from=this.character,F("W116",this,"!==","!=")):vt(e)?F("W041",this,"!==",e.value):vt(t)?F("W041",this,"!==",t.value):gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("!==",function(e,t){return gt(t,e,f)?F("W122",this,t.value):gt(e,t,f)&&F("W122",this,e.value),this}),dt("<"),dt(">"),dt("<="),dt(">="),St("<<","shiftleft",120),St(">>","shiftright",120),St(">>>","shiftrightunsigned",120),ht("in","in",120),ht("instanceof","instanceof",120),ht("+",function(e,t){var n;return t.left=e,t.right=n=Q(130),e&&n&&e.id==="(string)"&&n.id==="(string)"?(e.value+=n.value,e.character=n.character,!f.option.scripturl&&a.javascriptURL.test(e.value)&&F("W050",e),e):t},130),ut("+","num"),ut("+++",function(){return F("W007"),this.arity="unary",this.right=Q(150),this}),ht("+++",function(e){return F("W007"),this.left=e,this.right=Q(130),this},130),ht("-","sub",130),ut("-","neg"),ut("---",function(){return F("W006"),this.arity="unary",this.right=Q(150),this}),ht("---",function(e){return F("W006"),this.left=e,this.right=Q(130),this},130),ht("*","mult",140),ht("/","div",140),ht("%","mod",140),Tt("++"),ut("++","preinc"),f.syntax["++"].exps=!0,Tt("--"),ut("--","predec"),f.syntax["--"].exps=!0,ut("delete",function(){var e=Q(10);return e?(e.id!=="."&&e.id!=="["&&F("W051"),this.first=e,e.identifier&&!f.isStrict()&&(e.forgiveUndef=!0),this):this}).exps=!0,ut("~",function(){return f.option.bitwise&&F("W016",this,"~"),this.arity="unary",this.right=Q(150),this}),ut("...",function(){return f.inES6(!0)||F("W119",this,"spread/rest operator","6"),!f.tokens.next.identifier&&f.tokens.next.type!=="(string)"&&!hn(f.tokens.next,["[","("])&&q("E030",f.tokens.next,f.tokens.next.value),Q(150),this}),ut("!",function(){return this.arity="unary",this.right=Q(150),this.right||B("E041",this.line||0),t[this.right.id]===!0&&F("W018",this,"!"),this}),ut("typeof",function(){var e=Q(150);return this.first=this.right=e,e||B("E041",this.line||0,this.character||0),e.identifier&&(e.forgiveUndef=!0),this}),ut("new",function(){var e=Qt("target",function(){f.inES6(!0)||F("W119",f.tokens.prev,"new.target","6");var e,t=f.funct;while(t){e=!t["(global)"];if(!t["(arrow)"])break;t=t["(context)"]}e||F("W136",f.tokens.prev,"new.target")});if(e)return e;var t=Q(155),n;if(t&&t.id!=="function")if(t.identifier){t["new"]=!0;switch(t.value){case"Number":case"String":case"Boolean":case"Math":case"JSON":F("W053",f.tokens.prev,t.value);break;case"Symbol":f.inES6()&&F("W053",f.tokens.prev,t.value);break;case"Function":f.option.evil||F("W054");break;case"Date":case"RegExp":case"this":break;default:t.id!=="function"&&(n=t.value.substr(0,1),f.option.newcap&&(n<"A"||n>"Z")&&!f.funct["(scope)"].isPredefined(t.value)&&F("W055",f.tokens.curr))}}else t.id!=="."&&t.id!=="["&&t.id!=="("&&F("W056",f.tokens.curr);else f.option.supernew||F("W057",this);return f.tokens.next.id!=="("&&!f.option.supernew&&F("W058",f.tokens.curr,f.tokens.curr.value),this.first=this.right=t,this}),f.syntax["new"].exps=!0,ut("void").exps=!0,ht(".",function(e,t){var n=Ct(!1,!0);return typeof n=="string"&&Dt(n),t.left=e,t.right=n,n&&n==="hasOwnProperty"&&f.tokens.next.value==="="&&F("W001"),!e||e.value!=="arguments"||n!=="callee"&&n!=="caller"?!f.option.evil&&e&&e.value==="document"&&(n==="write"||n==="writeln")&&F("W060",e):f.option.noarg?F("W059",e,n):f.isStrict()&&q("E008"),!f.option.evil&&(n==="eval"||n==="execScript")&&yt(e,f)&&F("W061"),t},160,!0),ht("(",function(e,t){f.option.immed&&e&&!e.immed&&e.id==="function"&&F("W062");var n=0,r=[];e&&e.type==="(identifier)"&&e.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)&&"Array Number String Boolean Date Object Error Symbol".indexOf(e.value)===-1&&(e.value==="Math"?F("W063",e):f.option.newcap&&F("W064",e));if(f.tokens.next.id!==")")for(;;){r[r.length]=Q(10),n+=1;if(f.tokens.next.id!==",")break;tt()}return V(")"),typeof e=="object"&&(!f.inES5()&&e.value==="parseInt"&&n===1&&F("W065",f.tokens.curr),f.option.evil||(e.value==="eval"||e.value==="Function"||e.value==="execScript"?(F("W061",e),r[0]&&[0].id==="(string)"&&U(e,r[0].value)):!r[0]||r[0].id!=="(string)"||e.value!=="setTimeout"&&e.value!=="setInterval"?r[0]&&r[0].id==="(string)"&&e.value==="."&&e.left.value==="window"&&(e.right==="setTimeout"||e.right==="setInterval")&&(F("W066",e),U(e,r[0].value)):(F("W066",e),U(e,r[0].value))),!e.identifier&&e.id!=="."&&e.id!=="["&&e.id!=="=>"&&e.id!=="("&&e.id!=="&&"&&e.id!=="||"&&e.id!=="?"&&(!f.inES6()||!e["(name)"])&&F("W067",t)),t.left=e,t},155,!0).exps=!0,ut("(",function(){var e=f.tokens.next,t,n=-1,r,i,s,o,u=1,a=f.tokens.curr,l=f.tokens.prev,c=!f.option.singleGroups;do e.value==="("?u+=1:e.value===")"&&(u-=1),n+=1,t=e,e=W(n);while((u!==0||t.value!==")")&&e.value!==";"&&e.type!=="(end)");f.tokens.next.id==="function"&&(i=f.tokens.next.immed=!0);if(e.value==="=>")return Xt({type:"arrow",parsedOpening:!0});var h=[];if(f.tokens.next.id!==")")for(;;){h.push(Q(10));if(f.tokens.next.id!==",")break;f.option.nocomma&&F("W127"),tt()}V(")",this),f.option.immed&&h[0]&&h[0].id==="function"&&f.tokens.next.id!=="("&&f.tokens.next.id!=="."&&f.tokens.next.id!=="["&&F("W068",this);if(!h.length)return;return h.length>1?(r=Object.create(f.syntax[","]),r.exprs=h,s=h[0],o=h[h.length-1],c||(c=l.assign||l.delim)):(r=s=o=h[0],c||(c=a.beginsStmt&&(r.id==="{"||i||Ut(r))||i&&(!J()||f.tokens.prev.id!=="}")||Ut(r)&&!J()||r.id==="{"&&l.id==="=>"||r.type==="(number)"&&pn(e,".")&&/^\d+$/.test(r.value))),r&&(!c&&(s.left||s.right||r.exprs)&&(c=!K(l)&&s.lbp<=l.lbp||!J()&&o.lbp"),ht("[",function(e,t){var n=Q(10),r;return n&&n.type==="(string)"&&(!f.option.evil&&(n.value==="eval"||n.value==="execScript")&&yt(e,f)&&F("W061"),Dt(n.value),!f.option.sub&&a.identifier.test(n.value)&&(r=f.syntax[n.value],(!r||!O(r))&&F("W069",f.tokens.prev,n.value))),V("]",t),n&&n.value==="hasOwnProperty"&&f.tokens.next.value==="="&&F("W001"),t.left=e,t.right=n,t},160,!0),ut("[",function(){var e=an();if(e.isCompArray)return!f.option.esnext&&!f.inMoz()&&F("W118",f.tokens.curr,"array comprehension"),Bt();if(e.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;var t=f.tokens.curr.line!==G(f.tokens.next);this.first=[],t&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));while(f.tokens.next.id!=="(end)"){while(f.tokens.next.id===","){if(!f.option.elision){if(!!f.inES5()){F("W128");do V(",");while(f.tokens.next.id===",");continue}F("W070")}V(",")}if(f.tokens.next.id==="]")break;this.first.push(Q(10));if(f.tokens.next.id!==",")break;tt({allowTrailing:!0});if(f.tokens.next.id==="]"&&!f.inES5()){F("W070",f.tokens.curr);break}}return t&&(g-=f.option.indent),V("]",this),this}),function(e){e.nud=function(){var e,t,n,r,i,s=!1,o,u=Object.create(null);e=f.tokens.curr.line!==G(f.tokens.next),e&&(g+=f.option.indent,f.tokens.next.from===g+f.option.indent&&(g+=f.option.indent));var a=an();if(a.isDestAssign)return this.destructAssign=Gt({openingParsed:!0,assignment:!0}),this;for(;;){if(f.tokens.next.id==="}")break;o=f.tokens.next.value;if(!f.tokens.next.identifier||X().id!==","&&X().id!=="}")if(W().id===":"||o!=="get"&&o!=="set"){f.tokens.next.value==="*"&&f.tokens.next.type==="(punctuator)"?(f.inES6()||F("W104",f.tokens.next,"generator functions","6"),V("*"),s=!0):s=!1;if(f.tokens.next.id==="[")n=cn(),f.nameStack.set(n);else{f.nameStack.set(f.tokens.next),n=It(),fn(u,n,f.tokens.next);if(typeof n!="string")break}f.tokens.next.value==="("?(f.inES6()||F("W104",f.tokens.curr,"concise methods","6"),Xt({type:s?"generator":null})):(V(":"),Q(10))}else V(o),f.inES5()||q("E034"),n=It(),!n&&!f.inES6()&&q("E035"),n&&ln(o,u,n,f.tokens.curr),i=f.tokens.next,t=Xt(),r=t["(params)"],o==="get"&&n&&r?F("W076",i,r[0],n):o==="set"&&n&&(!r||r.length!==1)&&F("W077",i,n);else f.inES6()||F("W104",f.tokens.next,"object short notation","6"),n=It(!0),fn(u,n,f.tokens.next),Q(10);Dt(n);if(f.tokens.next.id!==",")break;tt({allowTrailing:!0,property:!0}),f.tokens.next.id===","?F("W070",f.tokens.curr):f.tokens.next.id==="}"&&!f.inES5()&&F("W070",f.tokens.curr)}return e&&(g-=f.option.indent),V("}",this),Kt(u),this},e.fud=function(){q("E036",f.tokens.curr)}}(rt("{"));var tn=it("const",function(e){return en("const",this,e)});tn.exps=!0;var nn=it("let",function(e){return en("let",this,e)});nn.exps=!0;var rn=it("var",function(e){var t=e&&e.prefix,n=e&&e.inexport,i,o,u,a=e&&e.implied,l=!e||!e.ignore;this.first=[];for(;;){var c=[];r.contains(["{","["],f.tokens.next.value)?(i=Gt(),o=!1):(i=[{id:Ct(),token:f.tokens.curr}],o=!0),(!t||!a)&&l&&f.option.varstmt&&F("W132",this),this.first=this.first.concat(c);for(var h in i)i.hasOwnProperty(h)&&(h=i[h],!a&&f.funct["(global)"]&&(S[h.id]===!1?F("W079",h.token,h.id):f.option.futurehostile===!1&&(!f.inES5()&&s.ecmaIdentifiers[5][h.id]===!1||!f.inES6()&&s.ecmaIdentifiers[6][h.id]===!1)&&F("W129",h.token,h.id)),h.id&&(a==="for"?(f.funct["(scope)"].has(h.id)||l&&F("W088",h.token,h.id),f.funct["(scope)"].block.use(h.id,h.token)):(f.funct["(scope)"].addlabel(h.id,{type:"var",token:h.token}),o&&n&&f.funct["(scope)"].setExported(h.id,h.token)),c.push(h.token)));f.tokens.next.id==="="&&(f.nameStack.set(f.tokens.curr),V("="),!t&&l&&!f.funct["(loopage)"]&&f.tokens.next.id==="undefined"&&F("W080",f.tokens.prev,f.tokens.prev.value),W(0).id==="="&&f.tokens.next.identifier&&(!t&&l&&!f.funct["(params)"]||f.funct["(params)"].indexOf(f.tokens.next.value)===-1)&&F("W120",f.tokens.next,f.tokens.next.value),u=Q(t?120:10),o?i[0].first=u:Zt(c,u));if(f.tokens.next.id!==",")break;tt()}return this});rn.exps=!0,st("class",function(){return sn.call(this,!0)}),st("function",function(e){var t=e&&e.inexport,n=!1;f.tokens.next.value==="*"&&(V("*"),f.inES6({strict:!0})?n=!0:F("W119",f.tokens.curr,"function*","6")),m&&F("W082",f.tokens.curr);var r=Nt();return f.funct["(scope)"].addlabel(r,{type:"function",token:f.tokens.curr}),r===undefined?F("W025"):t&&f.funct["(scope)"].setExported(r,f.tokens.prev),Xt({name:r,statement:this,type:n?"generator":null,ignoreLoopFunc:m}),f.tokens.next.id==="("&&f.tokens.next.line===f.tokens.curr.line&&q("E039"),this}),ut("function",function(){var e=!1;f.tokens.next.value==="*"&&(f.inES6()||F("W119",f.tokens.curr,"function*","6"),V("*"),e=!0);var t=Nt();return Xt({name:t,type:e?"generator":null}),this}),st("if",function(){var e=f.tokens.next;$t(),f.condition=!0,V("(");var t=Q(0);Jt(t);var n=null;f.option.forin&&f.forinifcheckneeded&&(f.forinifcheckneeded=!1,n=f.forinifchecks[f.forinifchecks.length-1],t.type==="(punctuator)"&&t.value==="!"?n.type="(negative)":n.type="(positive)"),V(")",e),f.condition=!1;var r=_t(!0,!0);return n&&n.type==="(negative)"&&r&&r[0]&&r[0].type==="(identifier)"&&r[0].value==="continue"&&(n.type="(negative-with-continue)"),f.tokens.next.id==="else"&&(V("else"),f.tokens.next.id==="if"||f.tokens.next.id==="switch"?At():_t(!0,!0)),this}),st("try",function(){function t(){V("catch"),V("("),f.funct["(scope)"].stack("catchparams");if(hn(f.tokens.next,["[","{"])){var e=Gt();r.each(e,function(e){e.id&&f.funct["(scope)"].addParam(e.id,e,"exception")})}else f.tokens.next.type!=="(identifier)"?F("E030",f.tokens.next,f.tokens.next.value):f.funct["(scope)"].addParam(Ct(),f.tokens.curr,"exception");f.tokens.next.value==="if"&&(f.inMoz()||F("W118",f.tokens.curr,"catch filter"),V("if"),Q(0)),V(")"),_t(!1),f.funct["(scope)"].unstack()}var e;_t(!0);while(f.tokens.next.id==="catch")$t(),e&&!f.inMoz()&&F("W118",f.tokens.next,"multiple catch blocks"),t(),e=!0;if(f.tokens.next.id==="finally"){V("finally"),_t(!0);return}return e||q("E021",f.tokens.next,"catch",f.tokens.next.value),this}),st("while",function(){var e=f.tokens.next;return f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,$t(),V("("),Jt(Q(0)),V(")",e),_t(!0,!0),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1,this}).labelled=!0,st("with",function(){var e=f.tokens.next;return f.isStrict()?q("E010",f.tokens.curr):f.option.withstmt||F("W085",f.tokens.curr),V("("),Q(0),V(")",e),_t(!0,!0),this}),st("switch",function(){var e=f.tokens.next,t=!1,n=!1;f.funct["(breakage)"]+=1,V("("),Jt(Q(0)),V(")",e),e=f.tokens.next,V("{"),f.tokens.next.from===g&&(n=!0),n||(g+=f.option.indent),this.cases=[];for(;;)switch(f.tokens.next.id){case"case":switch(f.funct["(verb)"]){case"yield":case"break":case"case":case"continue":case"return":case"switch":case"throw":break;default:f.tokens.curr.caseFallsThrough||F("W086",f.tokens.curr,"case")}V("case"),this.cases.push(Q(0)),$t(),t=!0,V(":"),f.funct["(verb)"]="case";break;case"default":switch(f.funct["(verb)"]){case"yield":case"break":case"continue":case"return":case"throw":break;default:this.cases.length&&(f.tokens.curr.caseFallsThrough||F("W086",f.tokens.curr,"default"))}V("default"),t=!0,V(":");break;case"}":n||(g-=f.option.indent),V("}",e),f.funct["(breakage)"]-=1,f.funct["(verb)"]=undefined;return;case"(end)":q("E023",f.tokens.next,"}");return;default:g+=f.option.indent;if(t)switch(f.tokens.curr.id){case",":q("E040");return;case":":t=!1,Ot();break;default:q("E025",f.tokens.curr);return}else{if(f.tokens.curr.id!==":"){q("E021",f.tokens.next,"case",f.tokens.next.value);return}V(":"),q("E024",f.tokens.curr,":"),Ot()}g-=f.option.indent}return this}).labelled=!0,it("debugger",function(){return f.option.debug||F("W087",this),this}).exps=!0,function(){var e=it("do",function(){f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,$t(),this.first=_t(!0,!0),V("while");var e=f.tokens.next;return V("("),Jt(Q(0)),V(")",e),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1,this});e.labelled=!0,e.exps=!0}(),st("for",function(){var e,t=f.tokens.next,n=!1,i=null;t.value==="each"&&(i=t,V("each"),f.inMoz()||F("W118",f.tokens.curr,"for each")),$t(),V("(");var s,o=0,u=["in","of"],a=0,l,c;hn(f.tokens.next,["{","["])&&++a;do{s=W(o),++o,hn(s,["{","["])?++a:hn(s,["}","]"])&&--a;if(a<0)break;a===0&&(!l&&pn(s,",")?l=s:!c&&pn(s,"=")&&(c=s))}while(a>0||!r.contains(u,s.value)&&s.value!==";"&&s.type!=="(end)");if(r.contains(u,s.value)){!f.inES6()&&s.value==="of"&&F("W104",s,"for of","6");var h=!c&&!l;c&&q("W133",l,s.value,"initializer is forbidden"),l&&q("W133",l,s.value,"more than one ForBinding"),f.tokens.next.id==="var"?(V("var"),f.tokens.curr.fud({prefix:!0})):f.tokens.next.id==="let"||f.tokens.next.id==="const"?(V(f.tokens.next.id),n=!0,f.funct["(scope)"].stack(),f.tokens.curr.fud({prefix:!0})):Object.create(rn).fud({prefix:!0,implied:"for",ignore:!h}),V(s.value),Q(20),V(")",t),s.value==="in"&&f.option.forin&&(f.forinifcheckneeded=!0,f.forinifchecks===undefined&&(f.forinifchecks=[]),f.forinifchecks.push({type:"(none)"})),f.funct["(breakage)"]+=1,f.funct["(loopage)"]+=1,e=_t(!0,!0);if(s.value==="in"&&f.option.forin){if(f.forinifchecks&&f.forinifchecks.length>0){var p=f.forinifchecks.pop();(e&&e.length>0&&(typeof e[0]!="object"||e[0].value!=="if")||p.type==="(positive)"&&e.length>1||p.type==="(negative)")&&F("W089",this)}f.forinifcheckneeded=!1}f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1}else{i&&q("E045",i);if(f.tokens.next.id!==";")if(f.tokens.next.id==="var")V("var"),f.tokens.curr.fud();else if(f.tokens.next.id==="let")V("let"),n=!0,f.funct["(scope)"].stack(),f.tokens.curr.fud();else for(;;){Q(0,"for");if(f.tokens.next.id!==",")break;l()}Z(f.tokens.curr),V(";"),f.funct["(loopage)"]+=1,f.tokens.next.id!==";"&&Jt(Q(0)),Z(f.tokens.curr),V(";"),f.tokens.next.id===";"&&q("E021",f.tokens.next,")",";");if(f.tokens.next.id!==")")for(;;){Q(0,"for");if(f.tokens.next.id!==",")break;l()}V(")",t),f.funct["(breakage)"]+=1,_t(!0,!0),f.funct["(breakage)"]-=1,f.funct["(loopage)"]-=1}return n&&f.funct["(scope)"].unstack(),this}).labelled=!0,it("break",function(){var e=f.tokens.next.value;return f.option.asi||Z(this),f.tokens.next.id!==";"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)?(f.funct["(scope)"].funct.hasBreakLabel(e)||F("W090",f.tokens.next,e),this.first=f.tokens.next,V()):f.funct["(breakage)"]===0&&F("W052",f.tokens.next,this.value),kt(this),this}).exps=!0,it("continue",function(){var e=f.tokens.next.value;return f.funct["(breakage)"]===0&&F("W052",f.tokens.next,this.value),f.funct["(loopage)"]||F("W052",f.tokens.next,this.value),f.option.asi||Z(this),f.tokens.next.id!==";"&&!f.tokens.next.reach&&f.tokens.curr.line===G(f.tokens.next)&&(f.funct["(scope)"].funct.hasBreakLabel(e)||F("W090",f.tokens.next,e),this.first=f.tokens.next,V()),kt(this),this}).exps=!0,it("return",function(){return this.line===G(f.tokens.next)?f.tokens.next.id!==";"&&!f.tokens.next.reach&&(this.first=Q(0),this.first&&this.first.type==="(punctuator)"&&this.first.value==="="&&!this.first.paren&&!f.option.boss&&I("W093",this.first.line,this.first.character)):f.tokens.next.type==="(punctuator)"&&["[","{","+","-"].indexOf(f.tokens.next.value)>-1&&Z(this),kt(this),this}).exps=!0,function(e){e.exps=!0,e.lbp=25}(ut("yield",function(){var e=f.tokens.prev;f.inES6(!0)&&!f.funct["(generator)"]?("(catch)"!==f.funct["(name)"]||!f.funct["(context)"]["(generator)"])&&q("E046",f.tokens.curr,"yield"):f.inES6()||F("W104",f.tokens.curr,"yield","6"),f.funct["(generator)"]="yielded";var t=!1;f.tokens.next.value==="*"&&(t=!0,V("*"));if(this.line===G(f.tokens.next)||!f.inMoz()){if(t||f.tokens.next.id!==";"&&!f.option.asi&&!f.tokens.next.reach&&f.tokens.next.nud)Y(f.tokens.curr,f.tokens.next),this.first=Q(10),this.first.type==="(punctuator)"&&this.first.value==="="&&!this.first.paren&&!f.option.boss&&I("W093",this.first.line,this.first.character);f.inMoz()&&f.tokens.next.id!==")"&&(e.lbp>30||!e.assign&&!J()||e.id==="yield")&&q("E050",this)}else f.option.asi||Z(this);return this})),it("throw",function(){return Z(this),this.first=Q(20),kt(this),this}).exps=!0,it("import",function(){f.inES6()||F("W119",f.tokens.curr,"import","6");if(f.tokens.next.type==="(string)")return V("(string)"),this;if(f.tokens.next.identifier){this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"const",token:f.tokens.curr});if(f.tokens.next.value!==",")return V("from"),V("(string)"),this;V(",")}if(f.tokens.next.id==="*")V("*"),V("as"),f.tokens.next.identifier&&(this.name=Ct(),f.funct["(scope)"].addlabel(this.name,{type:"const",token:f.tokens.curr}));else{V("{");for(;;){if(f.tokens.next.value==="}"){V("}");break}var e;f.tokens.next.type==="default"?(e="default",V("default")):e=Ct(),f.tokens.next.value==="as"&&(V("as"),e=Ct()),f.funct["(scope)"].addlabel(e,{type:"const",token:f.tokens.curr});if(f.tokens.next.value!==","){if(f.tokens.next.value==="}"){V("}");break}q("E024",f.tokens.next,f.tokens.next.value);break}V(",")}}return V("from"),V("(string)"),this}).exps=!0,it("export",function(){var e=!0,t,n;f.inES6()||(F("W119",f.tokens.curr,"export","6"),e=!1),f.funct["(scope)"].block.isGlobal()||(q("E053",f.tokens.curr),e=!1);if(f.tokens.next.value==="*")return V("*"),V("from"),V("(string)"),this;if(f.tokens.next.type==="default"){f.nameStack.set(f.tokens.next),V("default");var r=f.tokens.next.id;if(r==="function"||r==="class")this.block=!0;return t=W(),Q(10),n=t.value,this.block&&(f.funct["(scope)"].addlabel(n,{type:r,token:t}),f.funct["(scope)"].setExported(n,t)),this}if(f.tokens.next.value==="{"){V("{");var i=[];for(;;){f.tokens.next.identifier||q("E030",f.tokens.next,f.tokens.next.value),V(),i.push(f.tokens.curr),f.tokens.next.value==="as"&&(V("as"),f.tokens.next.identifier||q("E030",f.tokens.next,f.tokens.next.value),V());if(f.tokens.next.value!==","){if(f.tokens.next.value==="}"){V("}");break}q("E024",f.tokens.next,f.tokens.next.value);break}V(",")}return f.tokens.next.value==="from"?(V("from"),V("(string)")):e&&i.forEach(function(e){f.funct["(scope)"].setExported(e.value,e)}),this}if(f.tokens.next.id==="var")V("var"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="let")V("let"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="const")V("const"),f.tokens.curr.fud({inexport:!0});else if(f.tokens.next.id==="function")this.block=!0,V("function"),f.syntax["function"].fud({inexport:!0});else if(f.tokens.next.id==="class"){this.block=!0,V("class");var s=f.tokens.next;f.syntax["class"].fud(),f.funct["(scope)"].setExported(s.value,s)}else q("E024",f.tokens.next,f.tokens.next.value);return this}).exps=!0,lt("abstract"),lt("boolean"),lt("byte"),lt("char"),lt("class",{es5:!0,nud:sn}),lt("double"),lt("enum",{es5:!0}),lt("export",{es5:!0}),lt("extends",{es5:!0}),lt("final"),lt("float"),lt("goto"),lt("implements",{es5:!0,strictOnly:!0}),lt("import",{es5:!0}),lt("int"),lt("interface",{es5:!0,strictOnly:!0}),lt("long"),lt("native"),lt("package",{es5:!0,strictOnly:!0}),lt("private",{es5:!0,strictOnly:!0}),lt("protected",{es5:!0,strictOnly:!0}),lt("public",{es5:!0,strictOnly:!0}),lt("short"),lt("static",{es5:!0,strictOnly:!0}),lt("super",{es5:!0}),lt("synchronized"),lt("transient"),lt("volatile");var an=function(){var e,t,n,r=-1,i=0,s={};hn(f.tokens.curr,["[","{"])&&(i+=1);do{n=r===-1?f.tokens.curr:e,e=r===-1?f.tokens.next:W(r),t=W(r+1),r+=1,hn(e,["[","{"])?i+=1:hn(e,["]","}"])&&(i-=1);if(i===1&&e.identifier&&e.value==="for"&&!pn(n,".")){s.isCompArray=!0,s.notJson=!0;break}if(i===0&&hn(e,["}","]"])){if(t.value==="="){s.isDestAssign=!0,s.notJson=!0;break}if(t.value==="."){s.notJson=!0;break}}pn(e,";")&&(s.isBlock=!0,s.notJson=!0)}while(i>0&&e.id!=="(end)");return s},vn=function(){function i(e){var t=n.variables.filter(function(t){if(t.value===e)return t.undef=!1,e}).length;return t!==0}function s(e){var t=n.variables.filter(function(t){if(t.value===e&&!t.undef)return t.unused===!0&&(t.unused=!1),e}).length;return t===0}var e=function(){this.mode="use",this.variables=[]},t=[],n;return{stack:function(){n=new e,t.push(n)},unstack:function(){n.variables.filter(function(e){e.unused&&F("W098",e.token,e.raw_text||e.value),e.undef&&f.funct["(scope)"].block.use(e.value,e.token)}),t.splice(-1,1),n=t[t.length-1]},setState:function(e){r.contains(["use","define","generate","filter"],e)&&(n.mode=e)},check:function(e){if(!n)return;return n&&n.mode==="use"?(s(e)&&n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!0,unused:!1}),!0):n&&n.mode==="define"?(i(e)||n.variables.push({funct:f.funct,token:f.tokens.curr,value:e,undef:!1,unused:!0}),!0):n&&n.mode==="generate"?(f.funct["(scope)"].block.use(e,f.tokens.curr),!0):n&&n.mode==="filter"?(s(e)&&f.funct["(scope)"].block.use(e,f.tokens.curr),!0):!1}}},gn=function(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")},yn=function(t,i,o){function U(e,t){if(!e)return;!Array.isArray(e)&&typeof e=="object"&&(e=Object.keys(e)),e.forEach(t)}var a,l,c,d,A,O,M={},P={};i=r.clone(i),f.reset(),i&&i.scope?p.scope=i.scope:(p.errors=[],p.undefs=[],p.internals=[],p.blacklist={},p.scope="(main)"),S=Object.create(null),D(S,s.ecmaIdentifiers[3]),D(S,s.reservedVars),D(S,o||{}),n=Object.create(null);var j=Object.create(null);if(i){U(i.predef||null,function(e){var t,n;e[0]==="-"?(t=e.slice(1),p.blacklist[t]=t,delete S[t]):(n=Object.getOwnPropertyDescriptor(i.predef,e),S[e]=n?n.value:!1)}),U(i.exported||null,function(e){j[e]=!0}),delete i.predef,delete i.exported,O=Object.keys(i);for(c=0;c0&&(e.implieds=u),T.length>0&&(e.urls=T),o=f.funct["(scope)"].getUsedOrDefinedGlobals(),o.length>0&&(e.globals=o);for(r=1;r0&&(e.unused=a);for(s in w)if(typeof w[s]=="number"){e.member=w;break}return e},yn.jshint=yn,yn}();typeof n=="object"&&n&&(n.JSHINT=p)},{"../lodash":"/node_modules/jshint/lodash.js","./lex.js":"/node_modules/jshint/src/lex.js","./messages.js":"/node_modules/jshint/src/messages.js","./options.js":"/node_modules/jshint/src/options.js","./reg.js":"/node_modules/jshint/src/reg.js","./scope-manager.js":"/node_modules/jshint/src/scope-manager.js","./state.js":"/node_modules/jshint/src/state.js","./style.js":"/node_modules/jshint/src/style.js","./vars.js":"/node_modules/jshint/src/vars.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/lex.js":[function(e,t,n){"use strict";function h(){var e=[];return{push:function(t){e.push(t)},check:function(){for(var t=0;t0&&this.context[this.context.length-1].type===e},pushContext:function(e){this.context.push({type:e})},popContext:function(){return this.context.pop()},isContext:function(e){return this.context.length>0&&this.context[this.context.length-1]===e},currentContext:function(){return this.context.length>0&&this.context[this.context.length-1]},getLines:function(){return this._lines=o.lines,this._lines},setLines:function(e){this._lines=e,o.lines=this._lines},peek:function(e){return this.input.charAt(e||0)},skip:function(e){e=e||1,this.char+=e,this.input=this.input.slice(e)},on:function(e,t){e.split(" ").forEach(function(e){this.emitter.on(e,t)}.bind(this))},trigger:function(){this.emitter.emit.apply(this.emitter,Array.prototype.slice.call(arguments))},triggerAsync:function(e,t,n,r){n.push(function(){r()&&this.trigger(e,t)}.bind(this))},scanPunctuator:function(){var e=this.peek(),t,n,r;switch(e){case".":if(/^[0-9]$/.test(this.peek(1)))return null;if(this.peek(1)==="."&&this.peek(2)===".")return{type:l.Punctuator,value:"..."};case"(":case")":case";":case",":case"[":case"]":case":":case"~":case"?":return{type:l.Punctuator,value:e};case"{":return this.pushContext(c.Block),{type:l.Punctuator,value:e};case"}":return this.inContext(c.Block)&&this.popContext(),{type:l.Punctuator,value:e};case"#":return{type:l.Punctuator,value:e};case"":return null}return t=this.peek(1),n=this.peek(2),r=this.peek(3),e===">"&&t===">"&&n===">"&&r==="="?{type:l.Punctuator,value:">>>="}:e==="="&&t==="="&&n==="="?{type:l.Punctuator,value:"==="}:e==="!"&&t==="="&&n==="="?{type:l.Punctuator,value:"!=="}:e===">"&&t===">"&&n===">"?{type:l.Punctuator,value:">>>"}:e==="<"&&t==="<"&&n==="="?{type:l.Punctuator,value:"<<="}:e===">"&&t===">"&&n==="="?{type:l.Punctuator,value:">>="}:e==="="&&t===">"?{type:l.Punctuator,value:e+t}:e===t&&"+-<>&|".indexOf(e)>=0?{type:l.Punctuator,value:e+t}:"<>=!+-*%&|^".indexOf(e)>=0?t==="="?{type:l.Punctuator,value:e+t}:{type:l.Punctuator,value:e}:e==="/"?t==="="?{type:l.Punctuator,value:"/="}:{type:l.Punctuator,value:"/"}:null},scanComments:function(){function u(e,t,n){var r=["jshint","jslint","members","member","globals","global","exported"],i=!1,u=e+t,a="plain";return n=n||{},n.isMultiline&&(u+="*/"),t=t.replace(/\n/g," "),e==="/*"&&s.fallsThrough.test(t)&&(i=!0,a="falls through"),r.forEach(function(n){if(i)return;if(e==="//"&&n!=="jshint")return;t.charAt(n.length)===" "&&t.substr(0,n.length)===n&&(i=!0,e+=n,t=t.substr(n.length)),!i&&t.charAt(0)===" "&&t.charAt(n.length+1)===" "&&t.substr(1,n.length)===n&&(i=!0,e=e+" "+n,t=t.substr(n.length+1));if(!i)return;switch(n){case"member":a="members";break;case"global":a="globals";break;default:var r=t.split(":").map(function(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")});if(r.length===2)switch(r[0]){case"ignore":switch(r[1]){case"start":o.ignoringLinterErrors=!0,i=!1;break;case"end":o.ignoringLinterErrors=!1,i=!1}}a=n}}),{type:l.Comment,commentType:a,value:u,body:t,isSpecial:i,isMultiline:n.isMultiline||!1,isMalformed:n.isMalformed||!1}}var e=this.peek(),t=this.peek(1),n=this.input.substr(2),r=this.line,i=this.char,o=this;if(e==="*"&&t==="/")return this.trigger("error",{code:"E018",line:r,character:i}),this.skip(2),null;if(e!=="/"||t!=="*"&&t!=="/")return null;if(t==="/")return this.skip(this.input.length),u("//",n);var a="";if(t==="*"){this.inComment=!0,this.skip(2);while(this.peek()!=="*"||this.peek(1)!=="/")if(this.peek()===""){a+="\n";if(!this.nextLine())return this.trigger("error",{code:"E017",line:r,character:i}),this.inComment=!1,u("/*",a,{isMultiline:!0,isMalformed:!0})}else a+=this.peek(),this.skip();return this.skip(2),this.inComment=!1,u("/*",a,{isMultiline:!0})}},scanKeyword:function(){var e=/^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input),t=["if","in","do","var","for","new","try","let","this","else","case","void","with","enum","while","break","catch","throw","const","yield","class","super","return","typeof","delete","switch","export","import","default","finally","extends","function","continue","debugger","instanceof"];return e&&t.indexOf(e[0])>=0?{type:l.Keyword,value:e[0]}:null},scanIdentifier:function(){function i(e){return e>256}function s(e){return e>256}function o(e){return/^[0-9a-fA-F]$/.test(e)}function p(e){return e.replace(/\\u([0-9a-fA-F]{4})/g,function(e,t){return String.fromCharCode(parseInt(t,16))})}var e="",t=0,n,r,u=function(){t+=1;if(this.peek(t)!=="u")return null;var e=this.peek(t+1),n=this.peek(t+2),r=this.peek(t+3),i=this.peek(t+4),u;return o(e)&&o(n)&&o(r)&&o(i)?(u=parseInt(e+n+r+i,16),f[u]||s(u)?(t+=5,"\\u"+e+n+r+i):null):null}.bind(this),c=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?a[n]?(t+=1,e):null:i(n)?(t+=1,e):null}.bind(this),h=function(){var e=this.peek(t),n=e.charCodeAt(0);return n===92?u():n<128?f[n]?(t+=1,e):null:s(n)?(t+=1,e):null}.bind(this);r=c();if(r===null)return null;e=r;for(;;){r=h();if(r===null)break;e+=r}switch(e){case"true":case"false":n=l.BooleanLiteral;break;case"null":n=l.NullLiteral;break;default:n=l.Identifier}return{type:n,value:p(e),text:e,tokenLength:e.length}},scanNumericLiteral:function(){function f(e){return/^[0-9]$/.test(e)}function c(e){return/^[0-7]$/.test(e)}function h(e){return/^[01]$/.test(e)}function p(e){return/^[0-9a-fA-F]$/.test(e)}function d(e){return e==="$"||e==="_"||e==="\\"||e>="a"&&e<="z"||e>="A"&&e<="Z"}var e=0,t="",n=this.input.length,r=this.peek(e),i,s=f,u=10,a=!1;if(r!=="."&&!f(r))return null;if(r!=="."){t=this.peek(e),e+=1,r=this.peek(e);if(t==="0"){if(r==="x"||r==="X")s=p,u=16,e+=1,t+=r;if(r==="o"||r==="O")s=c,u=8,o.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Octal integer literal","6"]}),e+=1,t+=r;if(r==="b"||r==="B")s=h,u=2,o.inES6(!0)||this.trigger("warning",{code:"W119",line:this.line,character:this.char,data:["Binary integer literal","6"]}),e+=1,t+=r;c(r)&&(s=c,u=8,a=!0,i=!1,e+=1,t+=r),!c(r)&&f(r)&&(e+=1,t+=r)}while(e=0&&i<=7&&o.isStrict()});break;case"u":var s=this.input.substr(1,4),u=parseInt(s,16);isNaN(u)&&this.trigger("warning",{code:"W052",line:this.line,character:this.char,data:["u"+s]}),r=String.fromCharCode(u),n=5;break;case"v":this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\v"]},e,function(){return o.jsonMode}),r=" ";break;case"x":var a=parseInt(this.input.substr(1,2),16);this.triggerAsync("warning",{code:"W114",line:this.line,character:this.char,data:["\\x-"]},e,function(){return o.jsonMode}),r=String.fromCharCode(a),n=3;break;case"\\":r="\\\\";break;case'"':r='\\"';break;case"/":break;case"":t=!0,r=""}return{"char":r,jump:n,allowNewLine:t}},scanTemplateLiteral:function(e){var t,n="",r,i=this.line,s=this.char,u=this.templateStarts.length;if(!o.inES6(!0))return null;if(this.peek()==="`")t=l.TemplateHead,this.templateStarts.push({line:this.line,"char":this.char}),u=this.templateStarts.length,this.skip(1),this.pushContext(c.Template);else{if(!this.inContext(c.Template)||this.peek()!=="}")return null;t=l.TemplateMiddle}while(this.peek()!=="`"){while((r=this.peek())===""){n+="\n";if(!this.nextLine()){var a=this.templateStarts.pop();return this.trigger("error",{code:"E052",line:a.line,character:a.char}),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!0,depth:u,context:this.popContext()}}}if(r==="$"&&this.peek(1)==="{")return n+="${",this.skip(2),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.currentContext()};if(r==="\\"){var f=this.scanEscapeSequence(e);n+=f.char,this.skip(f.jump)}else r!=="`"&&(n+=r,this.skip(1))}return t=t===l.TemplateHead?l.NoSubstTemplate:l.TemplateTail,this.skip(1),this.templateStarts.pop(),{type:t,value:n,startLine:i,startChar:s,isUnclosed:!1,depth:u,context:this.popContext()}},scanStringLiteral:function(e){var t=this.peek();if(t!=='"'&&t!=="'")return null;this.triggerAsync("warning",{code:"W108",line:this.line,character:this.char},e,function(){return o.jsonMode&&t!=='"'});var n="",r=this.line,i=this.char,s=!1;this.skip();while(this.peek()!==t)if(this.peek()===""){s?(s=!1,this.triggerAsync("warning",{code:"W043",line:this.line,character:this.char},e,function(){return!o.option.multistr}),this.triggerAsync("warning",{code:"W042",line:this.line,character:this.char},e,function(){return o.jsonMode&&o.option.multistr})):this.trigger("warning",{code:"W112",line:this.line,character:this.char});if(!this.nextLine())return this.trigger("error",{code:"E029",line:r,character:i}),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!0,quote:t}}else{s=!1;var u=this.peek(),a=1;u<" "&&this.trigger("warning",{code:"W113",line:this.line,character:this.char,data:[""]});if(u==="\\"){var f=this.scanEscapeSequence(e);u=f.char,a=f.jump,s=f.allowNewLine}n+=u,this.skip(a)}return this.skip(),{type:l.StringLiteral,value:n,startLine:r,startChar:i,isUnclosed:!1,quote:t}},scanRegExp:function(){var e=0,t=this.input.length,n=this.peek(),r=n,i="",s=[],o=!1,u=!1,a,f=function(){n<" "&&(o=!0,this.trigger("warning",{code:"W048",line:this.line,character:this.char})),n==="<"&&(o=!0,this.trigger("warning",{code:"W049",line:this.line,character:this.char,data:[n]}))}.bind(this);if(!this.prereg||n!=="/")return null;e+=1,a=!1;while(e=this.getLines().length)return!1;this.input=this.getLines()[this.line],this.line+=1,this.char=1,this.from=1;var t=this.input.trim(),n=function(){return r.some(arguments,function(e){return t.indexOf(e)===0})},i=function(){return r.some(arguments,function(e){return t.indexOf(e,t.length-e.length)!==-1})};this.ignoringLinterErrors===!0&&!n("/*","//")&&(!this.inComment||!i("*/"))&&(this.input=""),e=this.scanNonBreakingSpaces(),e>=0&&this.trigger("warning",{code:"W125",line:this.line,character:e+1}),this.input=this.input.replace(/\t/g,o.tab),e=this.scanUnsafeChars(),e>=0&&this.trigger("warning",{code:"W100",line:this.line,character:e});if(!this.ignoringLinterErrors&&o.option.maxlen&&o.option.maxlen=0;--t){var n=a[t]["(labels)"];if(n[e])return n}}function x(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n["(usages)"][e])return n["(usages)"][e];if(n===l)break}return!1}function T(t,n){if(e.option.shadow!=="outer")return;var r=l["(type)"]==="global",i=u["(type)"]==="functionparams",s=!r;for(var o=0;o1?a[a.length-2]:null,n=u===l,i=u["(type)"]==="functionparams",f=u["(type)"]==="functionouter",p,d,g=u["(usages)"],y=u["(labels)"],E=Object.keys(g);g.__proto__&&E.indexOf("__proto__")===-1&&E.push("__proto__");for(p=0;p=0;s--){var o=a[s];if(o["(labels)"][e]&&(!n||o["(labels)"][e]["(blockscoped)"]))return o["(labels)"][e]["(type)"];var u=r?a[s-1]:o;if(u&&u["(type)"]==="functionparams")return null}return null},hasBreakLabel:function(e){for(var t=a.length-1;t>=0;t--){var n=a[t];if(n["(breakLabels)"][e])return!0;if(n["(type)"]==="functionparams")return!1}return!1},has:function(e,t){return Boolean(this.labeltype(e,t))},add:function(e,t,n,r){u["(labels)"][e]={"(type)":t,"(token)":n,"(blockscoped)":!1,"(function)":l,"(unused)":r}}},block:{isGlobal:function(){return u["(type)"]==="global"},use:function(t,n){var r=l["(parent)"];r&&r["(labels)"][t]&&r["(labels)"][t]["(type)"]==="param"&&(C.funct.has(t,{excludeParams:!0,onlyBlockscoped:!0})||(r["(labels)"][t]["(unused)"]=!1)),n&&(e.ignored.W117||e.option.undef===!1)&&(n.ignoreUndef=!0),g(t),n&&(n["(function)"]=l,u["(usages)"][t]["(tokens)"].push(n))},reassign:function(e,t){this.modify(e,t),u["(usages)"][e]["(reassigned)"].push(t)},modify:function(e,t){g(e),u["(usages)"][e]["(modified)"].push(t)},add:function(e,t,n,r){u["(labels)"][e]={"(type)":t,"(token)":n,"(blockscoped)":!0,"(unused)":r}},addBreakLabel:function(t,n){var r=n.token;C.funct.hasBreakLabel(t)?v("E011",r,t):e.option.shadow==="outer"&&(C.funct.has(t)?v("W004",r,t):T(t,r)),u["(breakLabels)"][t]=r}}};return C};t.exports=o},{"../lodash":"/node_modules/jshint/lodash.js",events:"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/state.js":[function(e,t,n){"use strict";var r=e("./name-stack.js"),i={syntax:{},isStrict:function(){return this.directive["use strict"]||this.inClassBody||this.option.module||this.option.strict==="implied"},inMoz:function(){return this.option.moz},inES6:function(){return this.option.moz||this.option.esversion>=6},inES5:function(e){return e?(!this.option.esversion||this.option.esversion===5)&&!this.option.moz:!this.option.esversion||this.option.esversion>=5||this.option.moz},reset:function(){this.tokens={prev:null,next:null,curr:null},this.option={},this.funct=null,this.ignored={},this.directive={},this.jsonMode=!1,this.jsonWarnings=[],this.lines=[],this.tab="",this.cache={},this.ignoredLines={},this.forinifcheckneeded=!1,this.nameStack=new r,this.inClassBody=!1}};n.state=i},{"./name-stack.js":"/node_modules/jshint/src/name-stack.js"}],"/node_modules/jshint/src/style.js":[function(e,t,n){"use strict";n.register=function(e){e.on("Identifier",function(n){if(e.getOption("proto"))return;n.name==="__proto__"&&e.warn("W103",{line:n.line,"char":n.char,data:[n.name,"6"]})}),e.on("Identifier",function(n){if(e.getOption("iterator"))return;n.name==="__iterator__"&&e.warn("W103",{line:n.line,"char":n.char,data:[n.name]})}),e.on("Identifier",function(n){if(!e.getOption("camelcase"))return;n.name.replace(/^_+|_+$/g,"").indexOf("_")>-1&&!n.name.match(/^[A-Z0-9_]*$/)&&e.warn("W106",{line:n.line,"char":n.from,data:[n.name]})}),e.on("String",function(n){var r=e.getOption("quotmark"),i;if(!r)return;r==="single"&&n.quote!=="'"&&(i="W109"),r==="double"&&n.quote!=='"'&&(i="W108"),r===!0&&(e.getCache("quotmark")||e.setCache("quotmark",n.quote),e.getCache("quotmark")!==n.quote&&(i="W110")),i&&e.warn(i,{line:n.line,"char":n.char})}),e.on("Number",function(n){n.value.charAt(0)==="."&&e.warn("W008",{line:n.line,"char":n.char,data:[n.value]}),n.value.substr(n.value.length-1)==="."&&e.warn("W047",{line:n.line,"char":n.char,data:[n.value]}),/^00+/.test(n.value)&&e.warn("W046",{line:n.line,"char":n.char,data:[n.value]})}),e.on("String",function(n){var r=/^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i;if(e.getOption("scripturl"))return;r.test(n.value)&&e.warn("W107",{line:n.line,"char":n.char})})}},{}],"/node_modules/jshint/src/vars.js":[function(e,t,n){"use strict";n.reservedVars={arguments:!1,NaN:!1},n.ecmaIdentifiers={3:{Array:!1,Boolean:!1,Date:!1,decodeURI:!1,decodeURIComponent:!1,encodeURI:!1,encodeURIComponent:!1,Error:!1,eval:!1,EvalError:!1,Function:!1,hasOwnProperty:!1,isFinite:!1,isNaN:!1,Math:!1,Number:!1,Object:!1,parseInt:!1,parseFloat:!1,RangeError:!1,ReferenceError:!1,RegExp:!1,String:!1,SyntaxError:!1,TypeError:!1,URIError:!1},5:{JSON:!1},6:{Map:!1,Promise:!1,Proxy:!1,Reflect:!1,Set:!1,Symbol:!1,WeakMap:!1,WeakSet:!1}},n.browser={Audio:!1,Blob:!1,addEventListener:!1,applicationCache:!1,atob:!1,blur:!1,btoa:!1,cancelAnimationFrame:!1,CanvasGradient:!1,CanvasPattern:!1,CanvasRenderingContext2D:!1,CSS:!1,clearInterval:!1,clearTimeout:!1,close:!1,closed:!1,Comment:!1,CustomEvent:!1,DOMParser:!1,defaultStatus:!1,Document:!1,document:!1,DocumentFragment:!1,Element:!1,ElementTimeControl:!1,Event:!1,event:!1,fetch:!1,FileReader:!1,FormData:!1,focus:!1,frames:!1,getComputedStyle:!1,HTMLElement:!1,HTMLAnchorElement:!1,HTMLBaseElement:!1,HTMLBlockquoteElement:!1,HTMLBodyElement:!1,HTMLBRElement:!1,HTMLButtonElement:!1,HTMLCanvasElement:!1,HTMLCollection:!1,HTMLDirectoryElement:!1,HTMLDivElement:!1,HTMLDListElement:!1,HTMLFieldSetElement:!1,HTMLFontElement:!1,HTMLFormElement:!1,HTMLFrameElement:!1,HTMLFrameSetElement:!1,HTMLHeadElement:!1,HTMLHeadingElement:!1,HTMLHRElement:!1,HTMLHtmlElement:!1,HTMLIFrameElement:!1,HTMLImageElement:!1,HTMLInputElement:!1,HTMLIsIndexElement:!1,HTMLLabelElement:!1,HTMLLayerElement:!1,HTMLLegendElement:!1,HTMLLIElement:!1,HTMLLinkElement:!1,HTMLMapElement:!1,HTMLMenuElement:!1,HTMLMetaElement:!1,HTMLModElement:!1,HTMLObjectElement:!1,HTMLOListElement:!1,HTMLOptGroupElement:!1,HTMLOptionElement:!1,HTMLParagraphElement:!1,HTMLParamElement:!1,HTMLPreElement:!1,HTMLQuoteElement:!1,HTMLScriptElement:!1,HTMLSelectElement:!1,HTMLStyleElement:!1,HTMLTableCaptionElement:!1,HTMLTableCellElement:!1,HTMLTableColElement:!1,HTMLTableElement:!1,HTMLTableRowElement:!1,HTMLTableSectionElement:!1,HTMLTemplateElement:!1,HTMLTextAreaElement:!1,HTMLTitleElement:!1,HTMLUListElement:!1,HTMLVideoElement:!1,history:!1,Image:!1,Intl:!1,length:!1,localStorage:!1,location:!1,matchMedia:!1,MessageChannel:!1,MessageEvent:!1,MessagePort:!1,MouseEvent:!1,moveBy:!1,moveTo:!1,MutationObserver:!1,name:!1,Node:!1,NodeFilter:!1,NodeList:!1,Notification:!1,navigator:!1,onbeforeunload:!0,onblur:!0,onerror:!0,onfocus:!0,onload:!0,onresize:!0,onunload:!0,open:!1,openDatabase:!1,opener:!1,Option:!1,parent:!1,performance:!1,print:!1,Range:!1,requestAnimationFrame:!1,removeEventListener:!1,resizeBy:!1,resizeTo:!1,screen:!1,scroll:!1,scrollBy:!1,scrollTo:!1,sessionStorage:!1,setInterval:!1,setTimeout:!1,SharedWorker:!1,status:!1,SVGAElement:!1,SVGAltGlyphDefElement:!1,SVGAltGlyphElement:!1,SVGAltGlyphItemElement:!1,SVGAngle:!1,SVGAnimateColorElement:!1,SVGAnimateElement:!1,SVGAnimateMotionElement:!1,SVGAnimateTransformElement:!1,SVGAnimatedAngle:!1,SVGAnimatedBoolean:!1,SVGAnimatedEnumeration:!1,SVGAnimatedInteger:!1,SVGAnimatedLength:!1,SVGAnimatedLengthList:!1,SVGAnimatedNumber:!1,SVGAnimatedNumberList:!1,SVGAnimatedPathData:!1,SVGAnimatedPoints:!1,SVGAnimatedPreserveAspectRatio:!1,SVGAnimatedRect:!1,SVGAnimatedString:!1,SVGAnimatedTransformList:!1,SVGAnimationElement:!1,SVGCSSRule:!1,SVGCircleElement:!1,SVGClipPathElement:!1,SVGColor:!1,SVGColorProfileElement:!1,SVGColorProfileRule:!1,SVGComponentTransferFunctionElement:!1,SVGCursorElement:!1,SVGDefsElement:!1,SVGDescElement:!1,SVGDocument:!1,SVGElement:!1,SVGElementInstance:!1,SVGElementInstanceList:!1,SVGEllipseElement:!1,SVGExternalResourcesRequired:!1,SVGFEBlendElement:!1,SVGFEColorMatrixElement:!1,SVGFEComponentTransferElement:!1,SVGFECompositeElement:!1,SVGFEConvolveMatrixElement:!1,SVGFEDiffuseLightingElement:!1,SVGFEDisplacementMapElement:!1,SVGFEDistantLightElement:!1,SVGFEFloodElement:!1,SVGFEFuncAElement:!1,SVGFEFuncBElement:!1,SVGFEFuncGElement:!1,SVGFEFuncRElement:!1,SVGFEGaussianBlurElement:!1,SVGFEImageElement:!1,SVGFEMergeElement:!1,SVGFEMergeNodeElement:!1,SVGFEMorphologyElement:!1,SVGFEOffsetElement:!1,SVGFEPointLightElement:!1,SVGFESpecularLightingElement:!1,SVGFESpotLightElement:!1,SVGFETileElement:!1,SVGFETurbulenceElement:!1,SVGFilterElement:!1,SVGFilterPrimitiveStandardAttributes:!1,SVGFitToViewBox:!1,SVGFontElement:!1,SVGFontFaceElement:!1,SVGFontFaceFormatElement:!1,SVGFontFaceNameElement:!1,SVGFontFaceSrcElement:!1,SVGFontFaceUriElement:!1,SVGForeignObjectElement:!1,SVGGElement:!1,SVGGlyphElement:!1,SVGGlyphRefElement:!1,SVGGradientElement:!1,SVGHKernElement:!1,SVGICCColor:!1,SVGImageElement:!1,SVGLangSpace:!1,SVGLength:!1,SVGLengthList:!1,SVGLineElement:!1,SVGLinearGradientElement:!1,SVGLocatable:!1,SVGMPathElement:!1,SVGMarkerElement:!1,SVGMaskElement:!1,SVGMatrix:!1,SVGMetadataElement:!1,SVGMissingGlyphElement:!1,SVGNumber:!1,SVGNumberList:!1,SVGPaint:!1,SVGPathElement:!1,SVGPathSeg:!1,SVGPathSegArcAbs:!1,SVGPathSegArcRel:!1,SVGPathSegClosePath:!1,SVGPathSegCurvetoCubicAbs:!1,SVGPathSegCurvetoCubicRel:!1,SVGPathSegCurvetoCubicSmoothAbs:!1,SVGPathSegCurvetoCubicSmoothRel:!1,SVGPathSegCurvetoQuadraticAbs:!1,SVGPathSegCurvetoQuadraticRel:!1,SVGPathSegCurvetoQuadraticSmoothAbs:!1,SVGPathSegCurvetoQuadraticSmoothRel:!1,SVGPathSegLinetoAbs:!1,SVGPathSegLinetoHorizontalAbs:!1,SVGPathSegLinetoHorizontalRel:!1,SVGPathSegLinetoRel:!1,SVGPathSegLinetoVerticalAbs:!1,SVGPathSegLinetoVerticalRel:!1,SVGPathSegList:!1,SVGPathSegMovetoAbs:!1,SVGPathSegMovetoRel:!1,SVGPatternElement:!1,SVGPoint:!1,SVGPointList:!1,SVGPolygonElement:!1,SVGPolylineElement:!1,SVGPreserveAspectRatio:!1,SVGRadialGradientElement:!1,SVGRect:!1,SVGRectElement:!1,SVGRenderingIntent:!1,SVGSVGElement:!1,SVGScriptElement:!1,SVGSetElement:!1,SVGStopElement:!1,SVGStringList:!1,SVGStylable:!1,SVGStyleElement:!1,SVGSwitchElement:!1,SVGSymbolElement:!1,SVGTRefElement:!1,SVGTSpanElement:!1,SVGTests:!1,SVGTextContentElement:!1,SVGTextElement:!1,SVGTextPathElement:!1,SVGTextPositioningElement:!1,SVGTitleElement:!1,SVGTransform:!1,SVGTransformList:!1,SVGTransformable:!1,SVGURIReference:!1,SVGUnitTypes:!1,SVGUseElement:!1,SVGVKernElement:!1,SVGViewElement:!1,SVGViewSpec:!1,SVGZoomAndPan:!1,Text:!1,TextDecoder:!1,TextEncoder:!1,TimeEvent:!1,top:!1,URL:!1,WebGLActiveInfo:!1,WebGLBuffer:!1,WebGLContextEvent:!1,WebGLFramebuffer:!1,WebGLProgram:!1,WebGLRenderbuffer:!1,WebGLRenderingContext:!1,WebGLShader:!1,WebGLShaderPrecisionFormat:!1,WebGLTexture:!1,WebGLUniformLocation:!1,WebSocket:!1,window:!1,Window:!1,Worker:!1,XDomainRequest:!1,XMLHttpRequest:!1,XMLSerializer:!1,XPathEvaluator:!1,XPathException:!1,XPathExpression:!1,XPathNamespace:!1,XPathNSResolver:!1,XPathResult:!1},n.devel={alert:!1,confirm:!1,console:!1,Debug:!1,opera:!1,prompt:!1},n.worker={importScripts:!0,postMessage:!0,self:!0,FileReaderSync:!0},n.nonstandard={escape:!1,unescape:!1},n.couch={require:!1,respond:!1,getRow:!1,emit:!1,send:!1,start:!1,sum:!1,log:!1,exports:!1,module:!1,provides:!1},n.node={__filename:!1,__dirname:!1,GLOBAL:!1,global:!1,module:!1,require:!1,Buffer:!0,console:!0,exports:!0,process:!0,setTimeout:!0,clearTimeout:!0,setInterval:!0,clearInterval:!0,setImmediate:!0,clearImmediate:!0},n.browserify={__filename:!1,__dirname:!1,global:!1,module:!1,require:!1,Buffer:!0,exports:!0,process:!0},n.phantom={phantom:!0,require:!0,WebPage:!0,console:!0,exports:!0},n.qunit={asyncTest:!1,deepEqual:!1,equal:!1,expect:!1,module:!1,notDeepEqual:!1,notEqual:!1,notPropEqual:!1,notStrictEqual:!1,ok:!1,propEqual:!1,QUnit:!1,raises:!1,start:!1,stop:!1,strictEqual:!1,test:!1,"throws":!1},n.rhino={defineClass:!1,deserialize:!1,gc:!1,help:!1,importClass:!1,importPackage:!1,java:!1,load:!1,loadClass:!1,Packages:!1,print:!1,quit:!1,readFile:!1,readUrl:!1,runCommand:!1,seal:!1,serialize:!1,spawn:!1,sync:!1,toint32:!1,version:!1},n.shelljs={target:!1,echo:!1,exit:!1,cd:!1,pwd:!1,ls:!1,find:!1,cp:!1,rm:!1,mv:!1,mkdir:!1,test:!1,cat:!1,sed:!1,grep:!1,which:!1,dirs:!1,pushd:!1,popd:!1,env:!1,exec:!1,chmod:!1,config:!1,error:!1,tempdir:!1},n.typed={ArrayBuffer:!1,ArrayBufferView:!1,DataView:!1,Float32Array:!1,Float64Array:!1,Int16Array:!1,Int32Array:!1,Int8Array:!1,Uint16Array:!1,Uint32Array:!1,Uint8Array:!1,Uint8ClampedArray:!1},n.wsh={ActiveXObject:!0,Enumerator:!0,GetObject:!0,ScriptEngine:!0,ScriptEngineBuildVersion:!0,ScriptEngineMajorVersion:!0,ScriptEngineMinorVersion:!0,VBArray:!0,WSH:!0,WScript:!0,XDomainRequest:!0},n.dojo={dojo:!1,dijit:!1,dojox:!1,define:!1,require:!1},n.jquery={$:!1,jQuery:!1},n.mootools={$:!1,$$:!1,Asset:!1,Browser:!1,Chain:!1,Class:!1,Color:!1,Cookie:!1,Core:!1,Document:!1,DomReady:!1,DOMEvent:!1,DOMReady:!1,Drag:!1,Element:!1,Elements:!1,Event:!1,Events:!1,Fx:!1,Group:!1,Hash:!1,HtmlTable:!1,IFrame:!1,IframeShim:!1,InputValidator:!1,instanceOf:!1,Keyboard:!1,Locale:!1,Mask:!1,MooTools:!1,Native:!1,Options:!1,OverText:!1,Request:!1,Scroller:!1,Slick:!1,Slider:!1,Sortables:!1,Spinner:!1,Swiff:!1,Tips:!1,Type:!1,typeOf:!1,URI:!1,Window:!1},n.prototypejs={$:!1,$$:!1,$A:!1,$F:!1,$H:!1,$R:!1,$break:!1,$continue:!1,$w:!1,Abstract:!1,Ajax:!1,Class:!1,Enumerable:!1,Element:!1,Event:!1,Field:!1,Form:!1,Hash:!1,Insertion:!1,ObjectRange:!1,PeriodicalExecuter:!1,Position:!1,Prototype:!1,Selector:!1,Template:!1,Toggle:!1,Try:!1,Autocompleter:!1,Builder:!1,Control:!1,Draggable:!1,Draggables:!1,Droppables:!1,Effect:!1,Sortable:!1,SortableObserver:!1,Sound:!1,Scriptaculous:!1},n.yui={YUI:!1,Y:!1,YUI_config:!1},n.mocha={mocha:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,context:!1,xcontext:!1,before:!1,after:!1,beforeEach:!1,afterEach:!1,suite:!1,test:!1,setup:!1,teardown:!1,suiteSetup:!1,suiteTeardown:!1},n.jasmine={jasmine:!1,describe:!1,xdescribe:!1,it:!1,xit:!1,beforeEach:!1,afterEach:!1,setFixtures:!1,loadFixtures:!1,spyOn:!1,expect:!1,runs:!1,waitsFor:!1,waits:!1,beforeAll:!1,afterAll:!1,fail:!1,fdescribe:!1,fit:!1,pending:!1}},{}]},{},["/node_modules/jshint/src/jshint.js"])}),ace.define("ace/mode/javascript_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/javascript/jshint"],function(require,exports,module){"use strict";function startRegex(e){return RegExp("^("+e.join("|")+")")}var oop=require("../lib/oop"),Mirror=require("../worker/mirror").Mirror,lint=require("./javascript/jshint").JSHINT,disabledWarningsRe=startRegex(["Bad for in variable '(.+)'.",'Missing "use strict"']),errorsRe=startRegex(["Unexpected","Expected ","Confusing (plus|minus)","\\{a\\} unterminated regular expression","Unclosed ","Unmatched ","Unbegun comment","Bad invocation","Missing space after","Missing operator at"]),infoRe=startRegex(["Expected an assignment","Bad escapement of EOL","Unexpected comma","Unexpected space","Missing radix parameter.","A leading decimal point can","\\['{a}'\\] is better written in dot notation.","'{a}' used out of scope"]),JavaScriptWorker=exports.JavaScriptWorker=function(e){Mirror.call(this,e),this.setTimeout(500),this.setOptions()};oop.inherits(JavaScriptWorker,Mirror),function(){this.setOptions=function(e){this.options=e||{esnext:!0,moz:!0,devel:!0,browser:!0,node:!0,laxcomma:!0,laxbreak:!0,lastsemic:!0,onevar:!1,passfail:!1,maxerr:100,expr:!0,multistr:!0,globalstrict:!0},this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.changeOptions=function(e){oop.mixin(this.options,e),this.doc.getValue()&&this.deferredUpdate.schedule(100)},this.isValidJS=function(str){try{eval("throw 0;"+str)}catch(e){if(e===0)return!0}return!1},this.onUpdate=function(){var e=this.doc.getValue();e=e.replace(/^#!.*\n/,"\n");if(!e)return this.sender.emit("annotate",[]);var t=[],n=this.isValidJS(e)?"warning":"error";lint(e,this.options);var r=lint.errors,i=!1;for(var s=0;s0||-1)*Math.floor(Math.abs(e))),e}function B(e){var t=typeof e;return e===null||t==="undefined"||t==="boolean"||t==="number"||t==="string"}function j(e){var t,n,r;if(B(e))return e;n=e.valueOf;if(typeof n=="function"){t=n.call(e);if(B(t))return t}r=e.toString;if(typeof r=="function"){t=r.call(e);if(B(t))return t}throw new TypeError}Function.prototype.bind||(Function.prototype.bind=function(t){var n=this;if(typeof n!="function")throw new TypeError("Function.prototype.bind called on incompatible "+n);var i=u.call(arguments,1),s=function(){if(this instanceof s){var e=n.apply(this,i.concat(u.call(arguments)));return Object(e)===e?e:this}return n.apply(t,i.concat(u.call(arguments)))};return n.prototype&&(r.prototype=n.prototype,s.prototype=new r,r.prototype=null),s});var i=Function.prototype.call,s=Array.prototype,o=Object.prototype,u=s.slice,a=i.bind(o.toString),f=i.bind(o.hasOwnProperty),l,c,h,p,d;if(d=f(o,"__defineGetter__"))l=i.bind(o.__defineGetter__),c=i.bind(o.__defineSetter__),h=i.bind(o.__lookupGetter__),p=i.bind(o.__lookupSetter__);if([1,2].splice(0).length!=2)if(!function(){function e(e){var t=new Array(e+2);return t[0]=t[1]=0,t}var t=[],n;t.splice.apply(t,e(20)),t.splice.apply(t,e(26)),n=t.length,t.splice(5,0,"XXX"),n+1==t.length;if(n+1==t.length)return!0}())Array.prototype.splice=function(e,t){var n=this.length;e>0?e>n&&(e=n):e==void 0?e=0:e<0&&(e=Math.max(n+e,0)),e+ta)for(h=l;h--;)this[f+h]=this[a+h];if(s&&e===c)this.length=c,this.push.apply(this,i);else{this.length=c+s;for(h=0;h>>0;if(a(t)!="[object Function]")throw new TypeError;while(++s>>0,s=Array(i),o=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var u=0;u>>0,s=[],o,u=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var f=0;f>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0,s=arguments[1];if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");for(var o=0;o>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduce of empty array with no initial value");var s=0,o;if(arguments.length>=2)o=arguments[1];else do{if(s in r){o=r[s++];break}if(++s>=i)throw new TypeError("reduce of empty array with no initial value")}while(!0);for(;s>>0;if(a(t)!="[object Function]")throw new TypeError(t+" is not a function");if(!i&&arguments.length==1)throw new TypeError("reduceRight of empty array with no initial value");var s,o=i-1;if(arguments.length>=2)s=arguments[1];else do{if(o in r){s=r[o--];break}if(--o<0)throw new TypeError("reduceRight of empty array with no initial value")}while(!0);do o in this&&(s=t.call(void 0,s,r[o],o,n));while(o--);return s});if(!Array.prototype.indexOf||[0,1].indexOf(1,2)!=-1)Array.prototype.indexOf=function(t){var n=g&&a(this)=="[object String]"?this.split(""):F(this),r=n.length>>>0;if(!r)return-1;var i=0;arguments.length>1&&(i=H(arguments[1])),i=i>=0?i:Math.max(0,r+i);for(;i>>0;if(!r)return-1;var i=r-1;arguments.length>1&&(i=Math.min(i,H(arguments[1]))),i=i>=0?i:r-Math.abs(i);for(;i>=0;i--)if(i in n&&t===n[i])return i;return-1};Object.getPrototypeOf||(Object.getPrototypeOf=function(t){return t.__proto__||(t.constructor?t.constructor.prototype:o)});if(!Object.getOwnPropertyDescriptor){var y="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(t,n){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(y+t);if(!f(t,n))return;var r,i,s;r={enumerable:!0,configurable:!0};if(d){var u=t.__proto__;t.__proto__=o;var i=h(t,n),s=p(t,n);t.__proto__=u;if(i||s)return i&&(r.get=i),s&&(r.set=s),r}return r.value=t[n],r}}Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(t){return Object.keys(t)});if(!Object.create){var b;Object.prototype.__proto__===null?b=function(){return{__proto__:null}}:b=function(){var e={};for(var t in e)e[t]=null;return e.constructor=e.hasOwnProperty=e.propertyIsEnumerable=e.isPrototypeOf=e.toLocaleString=e.toString=e.valueOf=e.__proto__=null,e},Object.create=function(t,n){var r;if(t===null)r=b();else{if(typeof t!="object")throw new TypeError("typeof prototype["+typeof t+"] != 'object'");var i=function(){};i.prototype=t,r=new i,r.__proto__=t}return n!==void 0&&Object.defineProperties(r,n),r}}if(Object.defineProperty){var E=w({}),S=typeof document=="undefined"||w(document.createElement("div"));if(!E||!S)var x=Object.defineProperty}if(!Object.defineProperty||x){var T="Property description must be an object: ",N="Object.defineProperty called on non-object: ",C="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(t,n,r){if(typeof t!="object"&&typeof t!="function"||t===null)throw new TypeError(N+t);if(typeof r!="object"&&typeof r!="function"||r===null)throw new TypeError(T+r);if(x)try{return x.call(Object,t,n,r)}catch(i){}if(f(r,"value"))if(d&&(h(t,n)||p(t,n))){var s=t.__proto__;t.__proto__=o,delete t[n],t[n]=r.value,t.__proto__=s}else t[n]=r.value;else{if(!d)throw new TypeError(C);f(r,"get")&&l(t,n,r.get),f(r,"set")&&c(t,n,r.set)}return t}}Object.defineProperties||(Object.defineProperties=function(t,n){for(var r in n)f(n,r)&&Object.defineProperty(t,r,n[r]);return t}),Object.seal||(Object.seal=function(t){return t}),Object.freeze||(Object.freeze=function(t){return t});try{Object.freeze(function(){})}catch(k){Object.freeze=function(t){return function(n){return typeof n=="function"?n:t(n)}}(Object.freeze)}Object.preventExtensions||(Object.preventExtensions=function(t){return t}),Object.isSealed||(Object.isSealed=function(t){return!1}),Object.isFrozen||(Object.isFrozen=function(t){return!1}),Object.isExtensible||(Object.isExtensible=function(t){if(Object(t)===t)throw new TypeError;var n="";while(f(t,n))n+="?";t[n]=!0;var r=f(t,n);return delete t[n],r});if(!Object.keys){var L=!0,A=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],O=A.length;for(var M in{toString:null})L=!1;Object.keys=function I(e){if(typeof e!="object"&&typeof e!="function"||e===null)throw new TypeError("Object.keys called on a non-object");var I=[];for(var t in e)f(e,t)&&I.push(t);if(L)for(var n=0,r=O;n+=?|!|&&|\|\||\?\:|[!$%&*+\-~\/^]=?/, + next : "start" + }, { + token : "punctuation.operator", + regex : /[?:,;.]/, + next : "start" + }, { + token : "paren.lparen", + regex : /[\[({]/, + next : "start" + }, { + token : "paren.rparen", + regex : /[\])}]/ + }, { + token: "comment", + regex: /^#!.*$/ + } + ], + property: [{ + token : "text", + regex : "\\s+" + }, { + token : [ + "storage.type", "punctuation.operator", "entity.name.function", "text", + "keyword.operator", "text", + "storage.type", "text", "entity.name.function", "text", "paren.lparen" + ], + regex : "(" + identifierRe + ")(\\.)(" + identifierRe +")(\\s*)(=)(\\s*)(function)(?:(\\s+)(\\w+))?(\\s*)(\\()", + next: "function_arguments" + }, { + token : "punctuation.operator", + regex : /[.](?![.])/ + }, { + token : "support.function", + regex : /(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\b(?=\()/ + }, { + token : "support.function.dom", + regex : /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\b(?=\()/ + }, { + token : "support.constant", + regex : /(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\b/ + }, { + token : "identifier", + regex : identifierRe + }, { + regex: "", + token: "empty", + next: "no_regex" + } + ], + "start": [ + DocCommentHighlightRules.getStartRule("doc-start"), + comments("start"), + { + token: "string.regexp", + regex: "\\/", + next: "regex" + }, { + token : "text", + regex : "\\s+|^$", + next : "start" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "regex": [ + { + token: "regexp.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "string.regexp", + regex: "/[sxngimy]*", + next: "no_regex" + }, { + token : "invalid", + regex: /\{\d+\b,?\d*\}[+*]|[+*$^?][+*]|[$^][?]|\?{3,}/ + }, { + token : "constant.language.escape", + regex: /\(\?[:=!]|\)|\{\d+\b,?\d*\}|[+*]\?|[()$^+*?.]/ + }, { + token : "constant.language.delimiter", + regex: /\|/ + }, { + token: "constant.language.escape", + regex: /\[\^?/, + next: "regex_character_class" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp" + } + ], + "regex_character_class": [ + { + token: "regexp.charclass.keyword.operator", + regex: "\\\\(?:u[\\da-fA-F]{4}|x[\\da-fA-F]{2}|.)" + }, { + token: "constant.language.escape", + regex: "]", + next: "regex" + }, { + token: "constant.language.escape", + regex: "-" + }, { + token: "empty", + regex: "$", + next: "no_regex" + }, { + defaultToken: "string.regexp.charachterclass" + } + ], + "function_arguments": [ + { + token: "variable.parameter", + regex: identifierRe + }, { + token: "punctuation.operator", + regex: "[, ]+" + }, { + token: "punctuation.operator", + regex: "$" + }, { + token: "empty", + regex: "", + next: "no_regex" + } + ], + "qqstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qqstring" + }, { + token : "string", + regex : '"|$', + next : "no_regex" + }, { + defaultToken: "string" + } + ], + "qstring" : [ + { + token : "constant.language.escape", + regex : escapedRe + }, { + token : "string", + regex : "\\\\$", + next : "qstring" + }, { + token : "string", + regex : "'|$", + next : "no_regex" + }, { + defaultToken: "string" + } + ] + }; + + + if (!options || !options.noES6) { + this.$rules.no_regex.unshift({ + regex: "[{}]", onMatch: function(val, state, stack) { + this.next = val == "{" ? this.nextState : ""; + if (val == "{" && stack.length) { + stack.unshift("start", state); + } + else if (val == "}" && stack.length) { + stack.shift(); + this.next = stack.shift(); + if (this.next.indexOf("string") != -1 || this.next.indexOf("jsx") != -1) + return "paren.quasi.end"; + } + return val == "{" ? "paren.lparen" : "paren.rparen"; + }, + nextState: "start" + }, { + token : "string.quasi.start", + regex : /`/, + push : [{ + token : "constant.language.escape", + regex : escapedRe + }, { + token : "paren.quasi.start", + regex : /\${/, + push : "start" + }, { + token : "string.quasi.end", + regex : /`/, + next : "pop" + }, { + defaultToken: "string.quasi" + }] + }); + + if (!options || !options.noJSX) + JSX.call(this); + } + + this.embedRules(DocCommentHighlightRules, "doc-", + [ DocCommentHighlightRules.getEndRule("no_regex") ]); + + this.normalizeRules(); +}; + +oop.inherits(JavaScriptHighlightRules, TextHighlightRules); + +function JSX() { + var tagRegex = identifierRe.replace("\\d", "\\d\\-"); + var jsxTag = { + onMatch : function(val, state, stack) { + var offset = val.charAt(1) == "/" ? 2 : 1; + if (offset == 1) { + if (state != this.nextState) + stack.unshift(this.next, this.nextState, 0); + else + stack.unshift(this.next); + stack[2]++; + } else if (offset == 2) { + if (state == this.nextState) { + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.shift(); + stack.shift(); + } + } + } + return [{ + type: "meta.tag.punctuation." + (offset == 1 ? "" : "end-") + "tag-open.xml", + value: val.slice(0, offset) + }, { + type: "meta.tag.tag-name.xml", + value: val.substr(offset) + }]; + }, + regex : "", + onMatch : function(value, currentState, stack) { + if (currentState == stack[0]) + stack.shift(); + if (value.length == 2) { + if (stack[0] == this.nextState) + stack[1]--; + if (!stack[1] || stack[1] < 0) { + stack.splice(0, 2); + } + } + this.next = stack[0] || "start"; + return [{type: this.token, value: value}]; + }, + nextState: "jsx" + }, + jsxJsRule, + comments("jsxAttributes"), + { + token : "entity.other.attribute-name.xml", + regex : tagRegex + }, { + token : "keyword.operator.attribute-equals.xml", + regex : "=" + }, { + token : "text.tag-whitespace.xml", + regex : "\\s+" + }, { + token : "string.attribute-value.xml", + regex : "'", + stateName : "jsx_attr_q", + push : [ + {token : "string.attribute-value.xml", regex: "'", next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, { + token : "string.attribute-value.xml", + regex : '"', + stateName : "jsx_attr_qq", + push : [ + {token : "string.attribute-value.xml", regex: '"', next: "pop"}, + {include : "reference"}, + {defaultToken : "string.attribute-value.xml"} + ] + }, + jsxTag + ]; + this.$rules.reference = [{ + token : "constant.language.escape.reference.xml", + regex : "(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\.-]+;)" + }]; +} + +function comments(next) { + return [ + { + token : "comment", // multi line comment + regex : /\/\*/, + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "\\*\\/", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + }, { + token : "comment", + regex : "\\/\\/", + next: [ + DocCommentHighlightRules.getTagRule(), + {token : "comment", regex : "$|^", next : next || "pop"}, + {defaultToken : "comment", caseInsensitive: true} + ] + } + ]; +} +exports.JavaScriptHighlightRules = JavaScriptHighlightRules; +}); + +ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; + +var MatchingBraceOutdent = function() {}; + +(function() { + + this.checkOutdent = function(line, input) { + if (! /^\s+$/.test(line)) + return false; + + return /^\s*\}/.test(input); + }; + + this.autoOutdent = function(doc, row) { + var line = doc.getLine(row); + var match = line.match(/^(\s*\})/); + + if (!match) return 0; + + var column = match[1].length; + var openBracePos = doc.findMatchingBracket({row: row, column: column}); + + if (!openBracePos || openBracePos.row == row) return 0; + + var indent = this.$getIndent(doc.getLine(openBracePos.row)); + doc.replace(new Range(row, 0, row, column-1), indent); + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + +}).call(MatchingBraceOutdent.prototype); + +exports.MatchingBraceOutdent = MatchingBraceOutdent; +}); + +ace.define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + +var context; +var contextCache = {}; +var initContext = function(editor) { + var id = -1; + if (editor.multiSelect) { + id = editor.selection.index; + if (contextCache.rangeCount != editor.multiSelect.rangeCount) + contextCache = {rangeCount: editor.multiSelect.rangeCount}; + } + if (contextCache[id]) + return context = contextCache[id]; + context = contextCache[id] = { + autoInsertedBrackets: 0, + autoInsertedRow: -1, + autoInsertedLineEnd: "", + maybeInsertedBrackets: 0, + maybeInsertedRow: -1, + maybeInsertedLineStart: "", + maybeInsertedLineEnd: "" + }; +}; + +var getWrapped = function(selection, selected, opening, closing) { + var rowDiff = selection.end.row - selection.start.row; + return { + text: opening + selected + closing, + selection: [ + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] + }; +}; + +var CstyleBehaviour = function() { + this.add("braces", "insertion", function(state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '{', '}'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + initContext(editor); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + initContext(editor); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", context.maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === '}') { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + if (!openBracePos) + return null; + var next_indent = this.$getIndent(session.getLine(openBracePos.row)); + } else if (closing) { + var next_indent = this.$getIndent(line); + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + return; + } + var indent = next_indent + session.getTabString(); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + } + }); + + this.add("braces", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + context.maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function(state, action, editor, session, text) { + if (text == '(') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '(', ')'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function(state, action, editor, session, text) { + if (text == '[') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '[', ']'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + if (text == '"' || text == "'") { + initContext(editor); + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, quote, quote); + } else if (!selected) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + var rightChar = line.substring(cursor.column, cursor.column + 1); + + var token = session.getTokenAt(cursor.row, cursor.column); + var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); + if (leftChar == "\\" && token && /escape/.test(token.type)) + return null; + + var stringBefore = token && /string|escape/.test(token.type); + var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + + var pair; + if (rightChar == quote) { + pair = stringBefore !== stringAfter; + } else { + if (stringBefore && !stringAfter) + return null; // wrap string with different quote + if (stringBefore && stringAfter) + return null; // do not pair quotes inside strings + var wordRe = session.$mode.tokenRe; + wordRe.lastIndex = 0; + var isWordBefore = wordRe.test(leftChar); + wordRe.lastIndex = 0; + var isWordAfter = wordRe.test(leftChar); + if (isWordBefore || isWordAfter) + return null; // before or after alphanumeric + if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) + return null; // there is rightChar and it isn't closing + pair = true; + } + return { + text: pair ? quote + quote : "", + selection: [1,1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + + +CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); +}; + +CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; +}; + +CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + context.autoInsertedBrackets = 0; + context.autoInsertedRow = cursor.row; + context.autoInsertedLineEnd = bracket + line.substr(cursor.column); + context.autoInsertedBrackets++; +}; + +CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = cursor.row; + context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + context.maybeInsertedLineEnd = line.substr(cursor.column); + context.maybeInsertedBrackets++; +}; + +CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return context.autoInsertedBrackets > 0 && + cursor.row === context.autoInsertedRow && + bracket === context.autoInsertedLineEnd[0] && + line.substr(cursor.column) === context.autoInsertedLineEnd; +}; + +CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return context.maybeInsertedBrackets > 0 && + cursor.row === context.maybeInsertedRow && + line.substr(cursor.column) === context.maybeInsertedLineEnd && + line.substr(0, cursor.column) == context.maybeInsertedLineStart; +}; + +CstyleBehaviour.popAutoInsertedClosing = function() { + context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); + context.autoInsertedBrackets--; +}; + +CstyleBehaviour.clearMaybeInsertedClosing = function() { + if (context) { + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = -1; + } +}; + + + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Range = require("../../range").Range; +var BaseFoldMode = require("./fold_mode").FoldMode; + +var FoldMode = exports.FoldMode = function(commentRegex) { + if (commentRegex) { + this.foldingStartMarker = new RegExp( + this.foldingStartMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.start) + ); + this.foldingStopMarker = new RegExp( + this.foldingStopMarker.source.replace(/\|[^|]*?$/, "|" + commentRegex.end) + ); + } +}; +oop.inherits(FoldMode, BaseFoldMode); + +(function() { + + this.foldingStartMarker = /(\{|\[)[^\}\]]*$|^\s*(\/\*)/; + this.foldingStopMarker = /^[^\[\{]*(\}|\])|^[\s\*]*(\*\/)/; + this.singleLineBlockCommentRe= /^\s*(\/\*).*\*\/\s*$/; + this.tripleStarBlockCommentRe = /^\s*(\/\*\*\*).*\*\/\s*$/; + this.startRegionRe = /^\s*(\/\*|\/\/)#?region\b/; + this._getFoldWidgetBase = this.getFoldWidget; + this.getFoldWidget = function(session, foldStyle, row) { + var line = session.getLine(row); + + if (this.singleLineBlockCommentRe.test(line)) { + if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line)) + return ""; + } + + var fw = this._getFoldWidgetBase(session, foldStyle, row); + + if (!fw && this.startRegionRe.test(line)) + return "start"; // lineCommentRegionStart + + return fw; + }; + + this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) { + var line = session.getLine(row); + + if (this.startRegionRe.test(line)) + return this.getCommentRegionBlock(session, line, row); + + var match = line.match(this.foldingStartMarker); + if (match) { + var i = match.index; + + if (match[1]) + return this.openingBracketBlock(session, match[1], row, i); + + var range = session.getCommentFoldRange(row, i + match[0].length, 1); + + if (range && !range.isMultiLine()) { + if (forceMultiline) { + range = this.getSectionRange(session, row); + } else if (foldStyle != "all") + range = null; + } + + return range; + } + + if (foldStyle === "markbegin") + return; + + var match = line.match(this.foldingStopMarker); + if (match) { + var i = match.index + match[0].length; + + if (match[1]) + return this.closingBracketBlock(session, match[1], row, i); + + return session.getCommentFoldRange(row, i, -1); + } + }; + + this.getSectionRange = function(session, row) { + var line = session.getLine(row); + var startIndent = line.search(/\S/); + var startRow = row; + var startColumn = line.length; + row = row + 1; + var endRow = row; + var maxRow = session.getLength(); + while (++row < maxRow) { + line = session.getLine(row); + var indent = line.search(/\S/); + if (indent === -1) + continue; + if (startIndent > indent) + break; + var subRange = this.getFoldWidgetRange(session, "all", row); + + if (subRange) { + if (subRange.start.row <= startRow) { + break; + } else if (subRange.isMultiLine()) { + row = subRange.end.row; + } else if (startIndent == indent) { + break; + } + } + endRow = row; + } + + return new Range(startRow, startColumn, endRow, session.getLine(endRow).length); + }; + this.getCommentRegionBlock = function(session, line, row) { + var startColumn = line.search(/\s*$/); + var maxRow = session.getLength(); + var startRow = row; + + var re = /^\s*(?:\/\*|\/\/|--)#?(end)?region\b/; + var depth = 1; + while (++row < maxRow) { + line = session.getLine(row); + var m = re.exec(line); + if (!m) continue; + if (m[1]) depth--; + else depth++; + + if (!depth) break; + } + + var endRow = row; + if (endRow > startRow) { + return new Range(startRow, startColumn, endRow, line.length); + } + }; + +}).call(FoldMode.prototype); + +}); + +ace.define("ace/mode/javascript",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/javascript_highlight_rules","ace/mode/matching_brace_outdent","ace/range","ace/worker/worker_client","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var JavaScriptHighlightRules = require("./javascript_highlight_rules").JavaScriptHighlightRules; +var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent; +var Range = require("../range").Range; +var WorkerClient = require("../worker/worker_client").WorkerClient; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var CStyleFoldMode = require("./folding/cstyle").FoldMode; + +var Mode = function() { + this.HighlightRules = JavaScriptHighlightRules; + + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); + this.foldingRules = new CStyleFoldMode(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.lineCommentStart = "//"; + this.blockComment = {start: "/*", end: "*/"}; + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.getTokenizer().getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start" || state == "no_regex") { + var match = line.match(/^.*(?:\bcase\b.*\:|[\{\(\[])\s*$/); + if (match) { + indent += tab; + } + } else if (state == "doc-start") { + if (endState == "start" || endState == "no_regex") { + return ""; + } + var match = line.match(/^\s*(\/?)\*/); + if (match) { + if (match[1]) { + indent += " "; + } + indent += "* "; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + this.createWorker = function(session) { + var worker = new WorkerClient(["ace"], "ace/mode/javascript_worker", "JavaScriptWorker"); + worker.attachToDocument(session.getDocument()); + + worker.on("annotate", function(results) { + session.setAnnotations(results.data); + }); + + worker.on("terminate", function() { + session.clearAnnotations(); + }); + + return worker; + }; + + this.$id = "ace/mode/javascript"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/common/resources/lib/ui-ace/theme-github.js b/common/resources/lib/ui-ace/theme-github.js new file mode 100644 index 0000000..d19512c --- /dev/null +++ b/common/resources/lib/ui-ace/theme-github.js @@ -0,0 +1,103 @@ +ace.define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) { + +exports.isDark = false; +exports.cssClass = "ace-github"; +exports.cssText = "\ +.ace-github .ace_gutter {\ +background: #e8e8e8;\ +color: #AAA;\ +}\ +.ace-github {\ +background: #fff;\ +color: #000;\ +}\ +.ace-github .ace_keyword {\ +font-weight: bold;\ +}\ +.ace-github .ace_string {\ +color: #D14;\ +}\ +.ace-github .ace_variable.ace_class {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_numeric {\ +color: #099;\ +}\ +.ace-github .ace_constant.ace_buildin {\ +color: #0086B3;\ +}\ +.ace-github .ace_support.ace_function {\ +color: #0086B3;\ +}\ +.ace-github .ace_comment {\ +color: #998;\ +font-style: italic;\ +}\ +.ace-github .ace_variable.ace_language {\ +color: #0086B3;\ +}\ +.ace-github .ace_paren {\ +font-weight: bold;\ +}\ +.ace-github .ace_boolean {\ +font-weight: bold;\ +}\ +.ace-github .ace_string.ace_regexp {\ +color: #009926;\ +font-weight: normal;\ +}\ +.ace-github .ace_variable.ace_instance {\ +color: teal;\ +}\ +.ace-github .ace_constant.ace_language {\ +font-weight: bold;\ +}\ +.ace-github .ace_cursor {\ +color: black;\ +}\ +.ace-github.ace_focus .ace_marker-layer .ace_active-line {\ +background: rgb(255, 255, 204);\ +}\ +.ace-github .ace_marker-layer .ace_active-line {\ +background: rgb(245, 245, 245);\ +}\ +.ace-github .ace_marker-layer .ace_selection {\ +background: rgb(181, 213, 255);\ +}\ +.ace-github.ace_multiselect .ace_selection.ace_start {\ +box-shadow: 0 0 3px 0px white;\ +}\ +.ace-github.ace_nobold .ace_line > span {\ +font-weight: normal !important;\ +}\ +.ace-github .ace_marker-layer .ace_step {\ +background: rgb(252, 255, 0);\ +}\ +.ace-github .ace_marker-layer .ace_stack {\ +background: rgb(164, 229, 101);\ +}\ +.ace-github .ace_marker-layer .ace_bracket {\ +margin: -1px 0 0 -1px;\ +border: 1px solid rgb(192, 192, 192);\ +}\ +.ace-github .ace_gutter-active-line {\ +background-color : rgba(0, 0, 0, 0.07);\ +}\ +.ace-github .ace_marker-layer .ace_selected-word {\ +background: rgb(250, 250, 255);\ +border: 1px solid rgb(200, 200, 250);\ +}\ +.ace-github .ace_invisible {\ +color: #BFBFBF\ +}\ +.ace-github .ace_print-margin {\ +width: 1px;\ +background: #e8e8e8;\ +}\ +.ace-github .ace_indent-guide {\ +background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\ +}"; + + var dom = require("../lib/dom"); + dom.importCssString(exports.cssText, exports.cssClass); +}); diff --git a/common/resources/lib/ui-ace/ui-ace.js b/common/resources/lib/ui-ace/ui-ace.js new file mode 100644 index 0000000..a664fb1 --- /dev/null +++ b/common/resources/lib/ui-ace/ui-ace.js @@ -0,0 +1,328 @@ +'use strict'; + +/** + * Binds a ACE Editor widget + */ +angular.module('ui.ace', []) + .constant('uiAceConfig', {}) + .directive('uiAce', ['uiAceConfig', function (uiAceConfig) { + + if (angular.isUndefined(window.ace)) { + throw new Error('ui-ace need ace to work... (o rly?)'); + } + + /** + * Sets editor options such as the wrapping mode or the syntax checker. + * + * The supported options are: + * + *
        + *
      • showGutter
      • + *
      • useWrapMode
      • + *
      • onLoad
      • + *
      • theme
      • + *
      • mode
      • + *
      + * + * @param acee + * @param session ACE editor session + * @param {object} opts Options to be set + */ + var setOptions = function(acee, session, opts) { + + // sets the ace worker path, if running from concatenated + // or minified source + if (angular.isDefined(opts.workerPath)) { + var config = window.ace.require('ace/config'); + config.set('workerPath', opts.workerPath); + } + // ace requires loading + if (angular.isDefined(opts.require)) { + opts.require.forEach(function (n) { + window.ace.require(n); + }); + } + // Boolean options + if (angular.isDefined(opts.showGutter)) { + acee.renderer.setShowGutter(opts.showGutter); + } + if (angular.isDefined(opts.useWrapMode)) { + session.setUseWrapMode(opts.useWrapMode); + } + if (angular.isDefined(opts.showInvisibles)) { + acee.renderer.setShowInvisibles(opts.showInvisibles); + } + if (angular.isDefined(opts.showIndentGuides)) { + acee.renderer.setDisplayIndentGuides(opts.showIndentGuides); + } + if (angular.isDefined(opts.useSoftTabs)) { + session.setUseSoftTabs(opts.useSoftTabs); + } + if (angular.isDefined(opts.showPrintMargin)) { + acee.setShowPrintMargin(opts.showPrintMargin); + } + + // commands + if (angular.isDefined(opts.disableSearch) && opts.disableSearch) { + acee.commands.addCommands([ + { + name: 'unfind', + bindKey: { + win: 'Ctrl-F', + mac: 'Command-F' + }, + exec: function () { + return false; + }, + readOnly: true + } + ]); + } + + // Basic options + if (angular.isString(opts.theme)) { + acee.setTheme('ace/theme/' + opts.theme); + } + if (angular.isString(opts.mode)) { + session.setMode('ace/mode/' + opts.mode); + } + // Advanced options + if (angular.isDefined(opts.firstLineNumber)) { + if (angular.isNumber(opts.firstLineNumber)) { + session.setOption('firstLineNumber', opts.firstLineNumber); + } else if (angular.isFunction(opts.firstLineNumber)) { + session.setOption('firstLineNumber', opts.firstLineNumber()); + } + } + + // advanced options + var key, obj; + if (angular.isDefined(opts.advanced)) { + for (key in opts.advanced) { + // create a javascript object with the key and value + obj = { name: key, value: opts.advanced[key] }; + // try to assign the option to the ace editor + acee.setOption(obj.name, obj.value); + } + } + + // advanced options for the renderer + if (angular.isDefined(opts.rendererOptions)) { + for (key in opts.rendererOptions) { + // create a javascript object with the key and value + obj = { name: key, value: opts.rendererOptions[key] }; + // try to assign the option to the ace editor + acee.renderer.setOption(obj.name, obj.value); + } + } + + // onLoad callbacks + angular.forEach(opts.callbacks, function (cb) { + if (angular.isFunction(cb)) { + cb(acee); + } + }); + }; + + return { + restrict: 'EA', + require: '?ngModel', + link: function (scope, elm, attrs, ngModel) { + + /** + * Corresponds the uiAceConfig ACE configuration. + * @type object + */ + var options = uiAceConfig.ace || {}; + + /** + * uiAceConfig merged with user options via json in attribute or data binding + * @type object + */ + var opts = angular.extend({}, options, scope.$eval(attrs.uiAce)); + + /** + * ACE editor + * @type object + */ + var acee = window.ace.edit(elm[0]); + + /** + * ACE editor session. + * @type object + * @see [EditSession]{@link http://ace.c9.io/#nav=api&api=edit_session} + */ + var session = acee.getSession(); + + /** + * Reference to a change listener created by the listener factory. + * @function + * @see listenerFactory.onChange + */ + var onChangeListener; + + /** + * Reference to a blur listener created by the listener factory. + * @function + * @see listenerFactory.onBlur + */ + var onBlurListener; + + /** + * Calls a callback by checking its existing. The argument list + * is variable and thus this function is relying on the arguments + * object. + * @throws {Error} If the callback isn't a function + */ + var executeUserCallback = function () { + + /** + * The callback function grabbed from the array-like arguments + * object. The first argument should always be the callback. + * + * @see [arguments]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments} + * @type {*} + */ + var callback = arguments[0]; + + /** + * Arguments to be passed to the callback. These are taken + * from the array-like arguments object. The first argument + * is stripped because that should be the callback function. + * + * @see [arguments]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/arguments} + * @type {Array} + */ + var args = Array.prototype.slice.call(arguments, 1); + + if (angular.isDefined(callback)) { + scope.$evalAsync(function () { + if (angular.isFunction(callback)) { + callback(args); + } else { + throw new Error('ui-ace use a function as callback.'); + } + }); + } + }; + + /** + * Listener factory. Until now only change listeners can be created. + * @type object + */ + var listenerFactory = { + /** + * Creates a change listener which propagates the change event + * and the editor session to the callback from the user option + * onChange. It might be exchanged during runtime, if this + * happens the old listener will be unbound. + * + * @param callback callback function defined in the user options + * @see onChangeListener + */ + onChange: function (callback) { + return function (e) { + var newValue = session.getValue(); + + if (ngModel && newValue !== ngModel.$viewValue && + // HACK make sure to only trigger the apply outside of the + // digest loop 'cause ACE is actually using this callback + // for any text transformation ! + !scope.$$phase && !scope.$root.$$phase) { + scope.$evalAsync(function () { + ngModel.$setViewValue(newValue); + }); + } + + executeUserCallback(callback, e, acee); + }; + }, + /** + * Creates a blur listener which propagates the editor session + * to the callback from the user option onBlur. It might be + * exchanged during runtime, if this happens the old listener + * will be unbound. + * + * @param callback callback function defined in the user options + * @see onBlurListener + */ + onBlur: function (callback) { + return function () { + executeUserCallback(callback, acee); + }; + } + }; + + attrs.$observe('readonly', function (value) { + acee.setReadOnly(!!value || value === ''); + }); + + // Value Blind + if (ngModel) { + ngModel.$formatters.push(function (value) { + if (angular.isUndefined(value) || value === null) { + return ''; + } + else if (angular.isObject(value) || angular.isArray(value)) { + throw new Error('ui-ace cannot use an object or an array as a model'); + } + return value; + }); + + ngModel.$render = function () { + session.setValue(ngModel.$viewValue); + }; + } + + // Listen for option updates + var updateOptions = function (current, previous) { + if (current === previous) return; + opts = angular.extend({}, options, scope.$eval(attrs.uiAce)); + + opts.callbacks = [ opts.onLoad ]; + if (opts.onLoad !== options.onLoad) { + // also call the global onLoad handler + opts.callbacks.unshift(options.onLoad); + } + + // EVENTS + + // unbind old change listener + session.removeListener('change', onChangeListener); + + // bind new change listener + onChangeListener = listenerFactory.onChange(opts.onChange); + session.on('change', onChangeListener); + + // unbind old blur listener + //session.removeListener('blur', onBlurListener); + acee.removeListener('blur', onBlurListener); + + // bind new blur listener + onBlurListener = listenerFactory.onBlur(opts.onBlur); + acee.on('blur', onBlurListener); + + setOptions(acee, session, opts); + }; + + scope.$watch(attrs.uiAce, updateOptions, /* deep watch */ true); + + // set the options here, even if we try to watch later, if this + // line is missing things go wrong (and the tests will also fail) + updateOptions(options); + + elm.on('$destroy', function () { + acee.session.$stopWorker(); + acee.destroy(); + }); + + scope.$watch(function() { + return [elm[0].offsetWidth, elm[0].offsetHeight]; + }, function() { + acee.resize(); + acee.renderer.updateFull(); + }, true); + + } + }; + }]); diff --git a/common/resources/lib/ui-ace/ui-ace.min.js b/common/resources/lib/ui-ace/ui-ace.min.js new file mode 100644 index 0000000..c69ced8 --- /dev/null +++ b/common/resources/lib/ui-ace/ui-ace.min.js @@ -0,0 +1,7 @@ +/** + * angular-ui-ace - This directive allows you to add ACE editor elements. + * @version v0.2.3 - 2016-02-09 + * @link http://angular-ui.github.com + * @license MIT + */ +"use strict";angular.module("ui.ace",[]).constant("uiAceConfig",{}).directive("uiAce",["uiAceConfig",function(a){if(angular.isUndefined(window.ace))throw new Error("ui-ace need ace to work... (o rly?)");var b=function(a,b,c){if(angular.isDefined(c.workerPath)){var d=window.ace.require("ace/config");d.set("workerPath",c.workerPath)}angular.isDefined(c.require)&&c.require.forEach(function(a){window.ace.require(a)}),angular.isDefined(c.showGutter)&&a.renderer.setShowGutter(c.showGutter),angular.isDefined(c.useWrapMode)&&b.setUseWrapMode(c.useWrapMode),angular.isDefined(c.showInvisibles)&&a.renderer.setShowInvisibles(c.showInvisibles),angular.isDefined(c.showIndentGuides)&&a.renderer.setDisplayIndentGuides(c.showIndentGuides),angular.isDefined(c.useSoftTabs)&&b.setUseSoftTabs(c.useSoftTabs),angular.isDefined(c.showPrintMargin)&&a.setShowPrintMargin(c.showPrintMargin),angular.isDefined(c.disableSearch)&&c.disableSearch&&a.commands.addCommands([{name:"unfind",bindKey:{win:"Ctrl-F",mac:"Command-F"},exec:function(){return!1},readOnly:!0}]),angular.isString(c.theme)&&a.setTheme("ace/theme/"+c.theme),angular.isString(c.mode)&&b.setMode("ace/mode/"+c.mode),angular.isDefined(c.firstLineNumber)&&(angular.isNumber(c.firstLineNumber)?b.setOption("firstLineNumber",c.firstLineNumber):angular.isFunction(c.firstLineNumber)&&b.setOption("firstLineNumber",c.firstLineNumber()));var e,f;if(angular.isDefined(c.advanced))for(e in c.advanced)f={name:e,value:c.advanced[e]},a.setOption(f.name,f.value);if(angular.isDefined(c.rendererOptions))for(e in c.rendererOptions)f={name:e,value:c.rendererOptions[e]},a.renderer.setOption(f.name,f.value);angular.forEach(c.callbacks,function(b){angular.isFunction(b)&&b(a)})};return{restrict:"EA",require:"?ngModel",link:function(c,d,e,f){var g,h,i=a.ace||{},j=angular.extend({},i,c.$eval(e.uiAce)),k=window.ace.edit(d[0]),l=k.getSession(),m=function(){var a=arguments[0],b=Array.prototype.slice.call(arguments,1);angular.isDefined(a)&&c.$evalAsync(function(){if(!angular.isFunction(a))throw new Error("ui-ace use a function as callback.");a(b)})},n={onChange:function(a){return function(b){var d=l.getValue();!f||d===f.$viewValue||c.$$phase||c.$root.$$phase||c.$evalAsync(function(){f.$setViewValue(d)}),m(a,b,k)}},onBlur:function(a){return function(){m(a,k)}}};e.$observe("readonly",function(a){k.setReadOnly(!!a||""===a)}),f&&(f.$formatters.push(function(a){if(angular.isUndefined(a)||null===a)return"";if(angular.isObject(a)||angular.isArray(a))throw new Error("ui-ace cannot use an object or an array as a model");return a}),f.$render=function(){l.setValue(f.$viewValue)});var o=function(a,d){a!==d&&(j=angular.extend({},i,c.$eval(e.uiAce)),j.callbacks=[j.onLoad],j.onLoad!==i.onLoad&&j.callbacks.unshift(i.onLoad),l.removeListener("change",g),g=n.onChange(j.onChange),l.on("change",g),k.removeListener("blur",h),h=n.onBlur(j.onBlur),k.on("blur",h),b(k,l,j))};c.$watch(e.uiAce,o,!0),o(i),d.on("$destroy",function(){k.session.$stopWorker(),k.destroy()}),c.$watch(function(){return[d[0].offsetWidth,d[0].offsetHeight]},function(){k.resize(),k.renderer.updateFull()},!0)}}}]); \ No newline at end of file diff --git a/common/resources/lib/ui-ace/worker-javascript.js b/common/resources/lib/ui-ace/worker-javascript.js new file mode 100644 index 0000000..064fbac --- /dev/null +++ b/common/resources/lib/ui-ace/worker-javascript.js @@ -0,0 +1,12530 @@ +"no use strict"; +;(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; + +if (!window.console) { + window.console = function() { + var msgs = Array.prototype.slice.call(arguments, 0); + postMessage({type: "log", data: msgs}); + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err.data, + file: file, + line: line, + col: col, + stack: err.stack + }}); +}; + +window.normalizeModule = function(parentId, moduleName) { + // normalize plugin requires + if (moduleName.indexOf("!") !== -1) { + var chunks = moduleName.split("!"); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); + } + // normalize relative requires + if (moduleName.charAt(0) == ".") { + var base = parentId.split("/").slice(0, -1).join("/"); + moduleName = (base ? base + "/" : "") + moduleName; + + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { + var previous = moduleName; + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + } + } + + return moduleName; +}; + +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } + if (!id.charAt) + throw new Error("worker.js require() accepts only (parentId, id) as arguments"); + + id = window.normalizeModule(parentId, id); + + var module = window.require.modules[id]; + if (module) { + if (!module.initialized) { + module.initialized = true; + module.exports = module.factory().exports; + } + return module.exports; + } + + if (!window.require.tlns) + return console.log("unable to load " + id); + + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; + + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules + importScripts(path); + return window.require(parentId, id); +}; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; + +window.define = function(id, deps, factory) { + if (arguments.length == 2) { + factory = deps; + if (typeof id != "string") { + deps = id; + id = window.require.id; + } + } else if (arguments.length == 1) { + factory = id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; + } + + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); + }; + + window.require.modules[id] = { + exports: {}, + factory: function() { + var module = this; + var returnExports = factory.apply(this, deps.map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); + if (returnExports) + module.exports = returnExports; + return module; + } + }; +}; +window.define.amd = {}; +require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + require.tlns[i] = topLevelNamespaces[i]; +}; + +window.initSender = function initSender() { + + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); + + var Sender = function() {}; + + (function() { + + oop.implement(this, EventEmitter); + + this.callback = function(data, callbackId) { + postMessage({ + type: "call", + id: callbackId, + data: data + }); + }; + + this.emit = function(name, data) { + postMessage({ + type: "event", + name: name, + data: data + }); + }; + + }).call(Sender.prototype); + + return new Sender(); +}; + +var main = window.main = null; +var sender = window.sender = null; + +window.onmessage = function(e) { + var msg = e.data; + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { + if (main[msg.command]) + main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); + else + throw new Error("Unknown command:" + msg.command); + } + else if (msg.init) { + window.initBaseUrls(msg.tlns); + require("ace/lib/es5-shim"); + sender = window.sender = window.initSender(); + var clazz = require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); + } +}; +})(this); + +ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; + +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; + +}); + +ace.define("ace/range",["require","exports","module"], function(require, exports, module) { +"use strict"; +var comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn + }; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEqual = function(range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +ace.define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],"/node_modules/jshint/data/ascii-identifier-data.js":[function(_dereq_,module,exports){ +var identifierStartTable = []; + +for (var i = 0; i < 128; i++) { + identifierStartTable[i] = + i === 36 || // $ + i >= 65 && i <= 90 || // A-Z + i === 95 || // _ + i >= 97 && i <= 122; // a-z +} + +var identifierPartTable = []; + +for (var i = 0; i < 128; i++) { + identifierPartTable[i] = + identifierStartTable[i] || // $, _, A-Z, a-z + i >= 48 && i <= 57; // 0-9 +} + +module.exports = { + asciiIdentifierStartTable: identifierStartTable, + asciiIdentifierPartTable: identifierPartTable +}; + +},{}],"/node_modules/jshint/lodash.js":[function(_dereq_,module,exports){ +(function (global){ +;(function() { + + var undefined; + + var VERSION = '3.7.0'; + + var FUNC_ERROR_TEXT = 'Expected a function'; + + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + + var arrayBufferTag = '[object ArrayBuffer]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g; + + var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g, + reHasRegExpChars = RegExp(reRegExpChars.source); + + var reEscapeChar = /\\(\\)?/g; + + var reFlags = /\w*$/; + + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dateTag] = typedArrayTags[errorTag] = + typedArrayTags[funcTag] = typedArrayTags[mapTag] = + typedArrayTags[numberTag] = typedArrayTags[objectTag] = + typedArrayTags[regexpTag] = typedArrayTags[setTag] = + typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false; + + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[boolTag] = + cloneableTags[dateTag] = cloneableTags[float32Tag] = + cloneableTags[float64Tag] = cloneableTags[int8Tag] = + cloneableTags[int16Tag] = cloneableTags[int32Tag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[stringTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[mapTag] = cloneableTags[setTag] = + cloneableTags[weakMapTag] = false; + + var objectTypes = { + 'function': true, + 'object': true + }; + + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global; + + var freeSelf = objectTypes[typeof self] && self && self.Object && self; + + var freeWindow = objectTypes[typeof window] && window && window.Object && window; + + var moduleExports = freeModule && freeModule.exports === freeExports && freeExports; + + var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this; + + function baseFindIndex(array, predicate, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + function baseIndexOf(array, value, fromIndex) { + if (value !== value) { + return indexOfNaN(array, fromIndex); + } + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + function baseIsFunction(value) { + return typeof value == 'function' || false; + } + + function baseToString(value) { + if (typeof value == 'string') { + return value; + } + return value == null ? '' : (value + ''); + } + + function indexOfNaN(array, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 0 : -1); + + while ((fromRight ? index-- : ++index < length)) { + var other = array[index]; + if (other !== other) { + return index; + } + } + return -1; + } + + function isObjectLike(value) { + return !!value && typeof value == 'object'; + } + + var arrayProto = Array.prototype, + objectProto = Object.prototype; + + var fnToString = Function.prototype.toString; + + var hasOwnProperty = objectProto.hasOwnProperty; + + var objToString = objectProto.toString; + + var reIsNative = RegExp('^' + + escapeRegExp(objToString) + .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + var ArrayBuffer = isNative(ArrayBuffer = root.ArrayBuffer) && ArrayBuffer, + bufferSlice = isNative(bufferSlice = ArrayBuffer && new ArrayBuffer(0).slice) && bufferSlice, + floor = Math.floor, + getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols, + getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf, + push = arrayProto.push, + preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + Uint8Array = isNative(Uint8Array = root.Uint8Array) && Uint8Array; + + var Float64Array = (function() { + try { + var func = isNative(func = root.Float64Array) && func, + result = new func(new ArrayBuffer(10), 0, 1) && func; + } catch(e) {} + return result; + }()); + + var nativeAssign = (function() { + var object = { '1': 0 }, + func = preventExtensions && isNative(func = Object.assign) && func; + + try { func(preventExtensions(object), 'xo'); } catch(e) {} + return !object[1] && func; + }()); + + var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray, + nativeKeys = isNative(nativeKeys = Object.keys) && nativeKeys, + nativeMax = Math.max, + nativeMin = Math.min; + + var NEGATIVE_INFINITY = Number.NEGATIVE_INFINITY; + + var MAX_ARRAY_LENGTH = Math.pow(2, 32) - 1, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0; + + var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1; + + function lodash() { + } + + var support = lodash.support = {}; + + (function(x) { + var Ctor = function() { this.x = x; }, + object = { '0': x, 'length': x }, + props = []; + + Ctor.prototype = { 'valueOf': x, 'y': x }; + for (var key in new Ctor) { props.push(key); } + + support.funcDecomp = /\bthis\b/.test(function() { return this; }); + + support.funcNames = typeof Function.name == 'string'; + + try { + support.nonEnumArgs = !propertyIsEnumerable.call(arguments, 1); + } catch(e) { + support.nonEnumArgs = true; + } + }(1, 0)); + + function arrayCopy(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + function arrayEach(array, iteratee) { + var index = -1, + length = array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + function arrayFilter(array, predicate) { + var index = -1, + length = array.length, + resIndex = -1, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[++resIndex] = value; + } + } + return result; + } + + function arrayMap(array, iteratee) { + var index = -1, + length = array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + function arrayMax(array) { + var index = -1, + length = array.length, + result = NEGATIVE_INFINITY; + + while (++index < length) { + var value = array[index]; + if (value > result) { + result = value; + } + } + return result; + } + + function arraySome(array, predicate) { + var index = -1, + length = array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + function assignWith(object, source, customizer) { + var props = keys(source); + push.apply(props, getSymbols(source)); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index], + value = object[key], + result = customizer(value, source[key], key, object, source); + + if ((result === result ? (result !== value) : (value === value)) || + (value === undefined && !(key in object))) { + object[key] = result; + } + } + return object; + } + + var baseAssign = nativeAssign || function(object, source) { + return source == null + ? object + : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object)); + }; + + function baseCopy(source, props, object) { + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + object[key] = source[key]; + } + return object; + } + + function baseCallback(func, thisArg, argCount) { + var type = typeof func; + if (type == 'function') { + return thisArg === undefined + ? func + : bindCallback(func, thisArg, argCount); + } + if (func == null) { + return identity; + } + if (type == 'object') { + return baseMatches(func); + } + return thisArg === undefined + ? property(func) + : baseMatchesProperty(func, thisArg); + } + + function baseClone(value, isDeep, customizer, key, object, stackA, stackB) { + var result; + if (customizer) { + result = object ? customizer(value, key, object) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return arrayCopy(value, result); + } + } else { + var tag = objToString.call(value), + isFunc = tag == funcTag; + + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = initCloneObject(isFunc ? {} : value); + if (!isDeep) { + return baseAssign(result, value); + } + } else { + return cloneableTags[tag] + ? initCloneByTag(value, tag, isDeep) + : (object ? value : {}); + } + } + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == value) { + return stackB[length]; + } + } + stackA.push(value); + stackB.push(result); + + (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) { + result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB); + }); + return result; + } + + var baseEach = createBaseEach(baseForOwn); + + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + var baseFor = createBaseFor(); + + function baseForIn(object, iteratee) { + return baseFor(object, iteratee, keysIn); + } + + function baseForOwn(object, iteratee) { + return baseFor(object, iteratee, keys); + } + + function baseGet(object, path, pathKey) { + if (object == null) { + return; + } + if (pathKey !== undefined && pathKey in toObject(object)) { + path = [pathKey]; + } + var index = -1, + length = path.length; + + while (object != null && ++index < length) { + var result = object = object[path[index]]; + } + return result; + } + + function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) { + if (value === other) { + return value !== 0 || (1 / value == 1 / other); + } + var valType = typeof value, + othType = typeof other; + + if ((valType != 'function' && valType != 'object' && othType != 'function' && othType != 'object') || + value == null || other == null) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB); + } + + function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = arrayTag, + othTag = arrayTag; + + if (!objIsArr) { + objTag = objToString.call(object); + if (objTag == argsTag) { + objTag = objectTag; + } else if (objTag != objectTag) { + objIsArr = isTypedArray(object); + } + } + if (!othIsArr) { + othTag = objToString.call(other); + if (othTag == argsTag) { + othTag = objectTag; + } else if (othTag != objectTag) { + othIsArr = isTypedArray(other); + } + } + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && !(objIsArr || objIsObj)) { + return equalByTag(object, other, objTag); + } + if (!isLoose) { + var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (valWrapped || othWrapped) { + return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB); + } + } + if (!isSameTag) { + return false; + } + stackA || (stackA = []); + stackB || (stackB = []); + + var length = stackA.length; + while (length--) { + if (stackA[length] == object) { + return stackB[length] == other; + } + } + stackA.push(object); + stackB.push(other); + + var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB); + + stackA.pop(); + stackB.pop(); + + return result; + } + + function baseIsMatch(object, props, values, strictCompareFlags, customizer) { + var index = -1, + length = props.length, + noCustomizer = !customizer; + + while (++index < length) { + if ((noCustomizer && strictCompareFlags[index]) + ? values[index] !== object[props[index]] + : !(props[index] in object) + ) { + return false; + } + } + index = -1; + while (++index < length) { + var key = props[index], + objValue = object[key], + srcValue = values[index]; + + if (noCustomizer && strictCompareFlags[index]) { + var result = objValue !== undefined || (key in object); + } else { + result = customizer ? customizer(objValue, srcValue, key) : undefined; + if (result === undefined) { + result = baseIsEqual(srcValue, objValue, customizer, true); + } + } + if (!result) { + return false; + } + } + return true; + } + + function baseMatches(source) { + var props = keys(source), + length = props.length; + + if (!length) { + return constant(true); + } + if (length == 1) { + var key = props[0], + value = source[key]; + + if (isStrictComparable(value)) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === value && (value !== undefined || (key in toObject(object))); + }; + } + } + var values = Array(length), + strictCompareFlags = Array(length); + + while (length--) { + value = source[props[length]]; + values[length] = value; + strictCompareFlags[length] = isStrictComparable(value); + } + return function(object) { + return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags); + }; + } + + function baseMatchesProperty(path, value) { + var isArr = isArray(path), + isCommon = isKey(path) && isStrictComparable(value), + pathKey = (path + ''); + + path = toPath(path); + return function(object) { + if (object == null) { + return false; + } + var key = pathKey; + object = toObject(object); + if ((isArr || !isCommon) && !(key in object)) { + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + if (object == null) { + return false; + } + key = last(path); + object = toObject(object); + } + return object[key] === value + ? (value !== undefined || (key in object)) + : baseIsEqual(value, object[key], null, true); + }; + } + + function baseMerge(object, source, customizer, stackA, stackB) { + if (!isObject(object)) { + return object; + } + var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source)); + if (!isSrcArr) { + var props = keys(source); + push.apply(props, getSymbols(source)); + } + arrayEach(props || source, function(srcValue, key) { + if (props) { + key = srcValue; + srcValue = source[key]; + } + if (isObjectLike(srcValue)) { + stackA || (stackA = []); + stackB || (stackB = []); + baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB); + } + else { + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; + + if (isCommon) { + result = srcValue; + } + if ((isSrcArr || result !== undefined) && + (isCommon || (result === result ? (result !== value) : (value === value)))) { + object[key] = result; + } + } + }); + return object; + } + + function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) { + var length = stackA.length, + srcValue = source[key]; + + while (length--) { + if (stackA[length] == srcValue) { + object[key] = stackB[length]; + return; + } + } + var value = object[key], + result = customizer ? customizer(value, srcValue, key, object, source) : undefined, + isCommon = result === undefined; + + if (isCommon) { + result = srcValue; + if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) { + result = isArray(value) + ? value + : (getLength(value) ? arrayCopy(value) : []); + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + result = isArguments(value) + ? toPlainObject(value) + : (isPlainObject(value) ? value : {}); + } + else { + isCommon = false; + } + } + stackA.push(srcValue); + stackB.push(result); + + if (isCommon) { + object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB); + } else if (result === result ? (result !== value) : (value === value)) { + object[key] = result; + } + } + + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + function basePropertyDeep(path) { + var pathKey = (path + ''); + path = toPath(path); + return function(object) { + return baseGet(object, path, pathKey); + }; + } + + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + start = start == null ? 0 : (+start || 0); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : (+end || 0); + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + function baseValues(object, props) { + var index = -1, + length = props.length, + result = Array(length); + + while (++index < length) { + result[index] = object[props[index]]; + } + return result; + } + + function binaryIndex(array, value, retHighest) { + var low = 0, + high = array ? array.length : low; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (retHighest ? (computed <= value) : (computed < value)) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return binaryIndexBy(array, value, identity, retHighest); + } + + function binaryIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); + + var low = 0, + high = array ? array.length : 0, + valIsNaN = value !== value, + valIsUndef = value === undefined; + + while (low < high) { + var mid = floor((low + high) / 2), + computed = iteratee(array[mid]), + isReflexive = computed === computed; + + if (valIsNaN) { + var setLow = isReflexive || retHighest; + } else if (valIsUndef) { + setLow = isReflexive && (retHighest || computed !== undefined); + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + function bindCallback(func, thisArg, argCount) { + if (typeof func != 'function') { + return identity; + } + if (thisArg === undefined) { + return func; + } + switch (argCount) { + case 1: return function(value) { + return func.call(thisArg, value); + }; + case 3: return function(value, index, collection) { + return func.call(thisArg, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(thisArg, accumulator, value, index, collection); + }; + case 5: return function(value, other, key, object, source) { + return func.call(thisArg, value, other, key, object, source); + }; + } + return function() { + return func.apply(thisArg, arguments); + }; + } + + function bufferClone(buffer) { + return bufferSlice.call(buffer, 0); + } + if (!bufferSlice) { + bufferClone = !(ArrayBuffer && Uint8Array) ? constant(null) : function(buffer) { + var byteLength = buffer.byteLength, + floatLength = Float64Array ? floor(byteLength / FLOAT64_BYTES_PER_ELEMENT) : 0, + offset = floatLength * FLOAT64_BYTES_PER_ELEMENT, + result = new ArrayBuffer(byteLength); + + if (floatLength) { + var view = new Float64Array(result, 0, floatLength); + view.set(new Float64Array(buffer, 0, floatLength)); + } + if (byteLength != offset) { + view = new Uint8Array(result, offset); + view.set(new Uint8Array(buffer, offset)); + } + return result; + }; + } + + function createAssigner(assigner) { + return restParam(function(object, sources) { + var index = -1, + length = object == null ? 0 : sources.length, + customizer = length > 2 && sources[length - 2], + guard = length > 2 && sources[2], + thisArg = length > 1 && sources[length - 1]; + + if (typeof customizer == 'function') { + customizer = bindCallback(customizer, thisArg, 5); + length -= 2; + } else { + customizer = typeof thisArg == 'function' ? thisArg : null; + length -= (customizer ? 1 : 0); + } + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? null : customizer; + length = 1; + } + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, customizer); + } + } + return object; + }); + } + + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + return eachFunc(collection, iteratee); + } + var index = fromRight ? length : -1, + iterable = toObject(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var iterable = toObject(object), + props = keysFunc(object), + length = props.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length)) { + var key = props[index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + function createFindIndex(fromRight) { + return function(array, predicate, thisArg) { + if (!(array && array.length)) { + return -1; + } + predicate = getCallback(predicate, thisArg, 3); + return baseFindIndex(array, predicate, fromRight); + }; + } + + function createForEach(arrayFunc, eachFunc) { + return function(collection, iteratee, thisArg) { + return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection)) + ? arrayFunc(collection, iteratee) + : eachFunc(collection, bindCallback(iteratee, thisArg, 3)); + }; + } + + function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) { + var index = -1, + arrLength = array.length, + othLength = other.length, + result = true; + + if (arrLength != othLength && !(isLoose && othLength > arrLength)) { + return false; + } + while (result && ++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + result = undefined; + if (customizer) { + result = isLoose + ? customizer(othValue, arrValue, index) + : customizer(arrValue, othValue, index); + } + if (result === undefined) { + if (isLoose) { + var othIndex = othLength; + while (othIndex--) { + othValue = other[othIndex]; + result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + if (result) { + break; + } + } + } else { + result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB); + } + } + } + return !!result; + } + + function equalByTag(object, other, tag) { + switch (tag) { + case boolTag: + case dateTag: + return +object == +other; + + case errorTag: + return object.name == other.name && object.message == other.message; + + case numberTag: + return (object != +object) + ? other != +other + : (object == 0 ? ((1 / object) == (1 / other)) : object == +other); + + case regexpTag: + case stringTag: + return object == (other + ''); + } + return false; + } + + function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) { + var objProps = keys(object), + objLength = objProps.length, + othProps = keys(other), + othLength = othProps.length; + + if (objLength != othLength && !isLoose) { + return false; + } + var skipCtor = isLoose, + index = -1; + + while (++index < objLength) { + var key = objProps[index], + result = isLoose ? key in other : hasOwnProperty.call(other, key); + + if (result) { + var objValue = object[key], + othValue = other[key]; + + result = undefined; + if (customizer) { + result = isLoose + ? customizer(othValue, objValue, key) + : customizer(objValue, othValue, key); + } + if (result === undefined) { + result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB); + } + } + if (!result) { + return false; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (!skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + return false; + } + } + return true; + } + + function getCallback(func, thisArg, argCount) { + var result = lodash.callback || callback; + result = result === callback ? baseCallback : result; + return argCount ? result(func, thisArg, argCount) : result; + } + + function getIndexOf(collection, target, fromIndex) { + var result = lodash.indexOf || indexOf; + result = result === indexOf ? baseIndexOf : result; + return collection ? result(collection, target, fromIndex) : result; + } + + var getLength = baseProperty('length'); + + var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) { + return getOwnPropertySymbols(toObject(object)); + }; + + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + function initCloneObject(object) { + var Ctor = object.constructor; + if (!(typeof Ctor == 'function' && Ctor instanceof Ctor)) { + Ctor = Object; + } + return new Ctor; + } + + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return bufferClone(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + var buffer = object.buffer; + return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length); + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + var result = new Ctor(object.source, reFlags.exec(object)); + result.lastIndex = object.lastIndex; + } + return result; + } + + function isIndex(value, length) { + value = +value; + length = length == null ? MAX_SAFE_INTEGER : length; + return value > -1 && value % 1 == 0 && value < length; + } + + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number') { + var length = getLength(object), + prereq = isLength(length) && isIndex(index, length); + } else { + prereq = type == 'string' && index in object; + } + if (prereq) { + var other = object[index]; + return value === value ? (value === other) : (other !== other); + } + return false; + } + + function isKey(value, object) { + var type = typeof value; + if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') { + return true; + } + if (isArray(value)) { + return false; + } + var result = !reIsDeepProp.test(value); + return result || (object != null && value in toObject(object)); + } + + function isLength(value) { + return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + function isStrictComparable(value) { + return value === value && (value === 0 ? ((1 / value) > 0) : !isObject(value)); + } + + function shimIsPlainObject(value) { + var Ctor, + support = lodash.support; + + if (!(isObjectLike(value) && objToString.call(value) == objectTag) || + (!hasOwnProperty.call(value, 'constructor') && + (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) { + return false; + } + var result; + baseForIn(value, function(subValue, key) { + result = key; + }); + return result === undefined || hasOwnProperty.call(value, result); + } + + function shimKeys(object) { + var props = keysIn(object), + propsLength = props.length, + length = propsLength && object.length, + support = lodash.support; + + var allowIndexes = length && isLength(length) && + (isArray(object) || (support.nonEnumArgs && isArguments(object))); + + var index = -1, + result = []; + + while (++index < propsLength) { + var key = props[index]; + if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) { + result.push(key); + } + } + return result; + } + + function toObject(value) { + return isObject(value) ? value : Object(value); + } + + function toPath(value) { + if (isArray(value)) { + return value; + } + var result = []; + baseToString(value).replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + } + + var findLastIndex = createFindIndex(true); + + function indexOf(array, value, fromIndex) { + var length = array ? array.length : 0; + if (!length) { + return -1; + } + if (typeof fromIndex == 'number') { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex; + } else if (fromIndex) { + var index = binaryIndex(array, value), + other = array[index]; + + if (value === value ? (value === other) : (other !== other)) { + return index; + } + return -1; + } + return baseIndexOf(array, value, fromIndex || 0); + } + + function last(array) { + var length = array ? array.length : 0; + return length ? array[length - 1] : undefined; + } + + function slice(array, start, end) { + var length = array ? array.length : 0; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + return baseSlice(array, start, end); + } + + function unzip(array) { + var index = -1, + length = (array && array.length && arrayMax(arrayMap(array, getLength))) >>> 0, + result = Array(length); + + while (++index < length) { + result[index] = arrayMap(array, baseProperty(index)); + } + return result; + } + + var zip = restParam(unzip); + + var forEach = createForEach(arrayEach, baseEach); + + function includes(collection, target, fromIndex, guard) { + var length = collection ? getLength(collection) : 0; + if (!isLength(length)) { + collection = values(collection); + length = collection.length; + } + if (!length) { + return false; + } + if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) { + fromIndex = 0; + } else { + fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0); + } + return (typeof collection == 'string' || !isArray(collection) && isString(collection)) + ? (fromIndex < length && collection.indexOf(target, fromIndex) > -1) + : (getIndexOf(collection, target, fromIndex) > -1); + } + + function reject(collection, predicate, thisArg) { + var func = isArray(collection) ? arrayFilter : baseFilter; + predicate = getCallback(predicate, thisArg, 3); + return func(collection, function(value, index, collection) { + return !predicate(value, index, collection); + }); + } + + function some(collection, predicate, thisArg) { + var func = isArray(collection) ? arraySome : baseSome; + if (thisArg && isIterateeCall(collection, predicate, thisArg)) { + predicate = null; + } + if (typeof predicate != 'function' || thisArg !== undefined) { + predicate = getCallback(predicate, thisArg, 3); + } + return func(collection, predicate); + } + + function restParam(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + rest = Array(length); + + while (++index < length) { + rest[index] = args[start + index]; + } + switch (start) { + case 0: return func.call(this, rest); + case 1: return func.call(this, args[0], rest); + case 2: return func.call(this, args[0], args[1], rest); + } + var otherArgs = Array(start + 1); + index = -1; + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = rest; + return func.apply(this, otherArgs); + }; + } + + function clone(value, isDeep, customizer, thisArg) { + if (isDeep && typeof isDeep != 'boolean' && isIterateeCall(value, isDeep, customizer)) { + isDeep = false; + } + else if (typeof isDeep == 'function') { + thisArg = customizer; + customizer = isDeep; + isDeep = false; + } + customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 1); + return baseClone(value, isDeep, customizer); + } + + function isArguments(value) { + var length = isObjectLike(value) ? value.length : undefined; + return isLength(length) && objToString.call(value) == argsTag; + } + + var isArray = nativeIsArray || function(value) { + return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag; + }; + + function isEmpty(value) { + if (value == null) { + return true; + } + var length = getLength(value); + if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) || + (isObjectLike(value) && isFunction(value.splice)))) { + return !length; + } + return !keys(value).length; + } + + var isFunction = !(baseIsFunction(/x/) || (Uint8Array && !baseIsFunction(Uint8Array))) ? baseIsFunction : function(value) { + return objToString.call(value) == funcTag; + }; + + function isObject(value) { + var type = typeof value; + return type == 'function' || (!!value && type == 'object'); + } + + function isNative(value) { + if (value == null) { + return false; + } + if (objToString.call(value) == funcTag) { + return reIsNative.test(fnToString.call(value)); + } + return isObjectLike(value) && reIsHostCtor.test(value); + } + + function isNumber(value) { + return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag); + } + + var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) { + if (!(value && objToString.call(value) == objectTag)) { + return false; + } + var valueOf = value.valueOf, + objProto = isNative(valueOf) && (objProto = getPrototypeOf(valueOf)) && getPrototypeOf(objProto); + + return objProto + ? (value == objProto || getPrototypeOf(value) == objProto) + : shimIsPlainObject(value); + }; + + function isString(value) { + return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag); + } + + function isTypedArray(value) { + return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)]; + } + + function toPlainObject(value) { + return baseCopy(value, keysIn(value)); + } + + var assign = createAssigner(function(object, source, customizer) { + return customizer + ? assignWith(object, source, customizer) + : baseAssign(object, source); + }); + + function has(object, path) { + if (object == null) { + return false; + } + var result = hasOwnProperty.call(object, path); + if (!result && !isKey(path)) { + path = toPath(path); + object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1)); + path = last(path); + result = object != null && hasOwnProperty.call(object, path); + } + return result; + } + + var keys = !nativeKeys ? shimKeys : function(object) { + if (object) { + var Ctor = object.constructor, + length = object.length; + } + if ((typeof Ctor == 'function' && Ctor.prototype === object) || + (typeof object != 'function' && isLength(length))) { + return shimKeys(object); + } + return isObject(object) ? nativeKeys(object) : []; + }; + + function keysIn(object) { + if (object == null) { + return []; + } + if (!isObject(object)) { + object = Object(object); + } + var length = object.length; + length = (length && isLength(length) && + (isArray(object) || (support.nonEnumArgs && isArguments(object))) && length) || 0; + + var Ctor = object.constructor, + index = -1, + isProto = typeof Ctor == 'function' && Ctor.prototype === object, + result = Array(length), + skipIndexes = length > 0; + + while (++index < length) { + result[index] = (index + ''); + } + for (var key in object) { + if (!(skipIndexes && isIndex(key, length)) && + !(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + var merge = createAssigner(baseMerge); + + function values(object) { + return baseValues(object, keys(object)); + } + + function escapeRegExp(string) { + string = baseToString(string); + return (string && reHasRegExpChars.test(string)) + ? string.replace(reRegExpChars, '\\$&') + : string; + } + + function callback(func, thisArg, guard) { + if (guard && isIterateeCall(func, thisArg, guard)) { + thisArg = null; + } + return baseCallback(func, thisArg); + } + + function constant(value) { + return function() { + return value; + }; + } + + function identity(value) { + return value; + } + + function property(path) { + return isKey(path) ? baseProperty(path) : basePropertyDeep(path); + } + lodash.assign = assign; + lodash.callback = callback; + lodash.constant = constant; + lodash.forEach = forEach; + lodash.keys = keys; + lodash.keysIn = keysIn; + lodash.merge = merge; + lodash.property = property; + lodash.reject = reject; + lodash.restParam = restParam; + lodash.slice = slice; + lodash.toPlainObject = toPlainObject; + lodash.unzip = unzip; + lodash.values = values; + lodash.zip = zip; + + lodash.each = forEach; + lodash.extend = assign; + lodash.iteratee = callback; + lodash.clone = clone; + lodash.escapeRegExp = escapeRegExp; + lodash.findLastIndex = findLastIndex; + lodash.has = has; + lodash.identity = identity; + lodash.includes = includes; + lodash.indexOf = indexOf; + lodash.isArguments = isArguments; + lodash.isArray = isArray; + lodash.isEmpty = isEmpty; + lodash.isFunction = isFunction; + lodash.isNative = isNative; + lodash.isNumber = isNumber; + lodash.isObject = isObject; + lodash.isPlainObject = isPlainObject; + lodash.isString = isString; + lodash.isTypedArray = isTypedArray; + lodash.last = last; + lodash.some = some; + + lodash.any = some; + lodash.contains = includes; + lodash.include = includes; + + lodash.VERSION = VERSION; + if (freeExports && freeModule) { + if (moduleExports) { + (freeModule.exports = lodash)._ = lodash; + } + else { + freeExports._ = lodash; + } + } + else { + root._ = lodash; + } +}.call(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],"/node_modules/jshint/src/jshint.js":[function(_dereq_,module,exports){ + +var _ = _dereq_("../lodash"); +var events = _dereq_("events"); +var vars = _dereq_("./vars.js"); +var messages = _dereq_("./messages.js"); +var Lexer = _dereq_("./lex.js").Lexer; +var reg = _dereq_("./reg.js"); +var state = _dereq_("./state.js").state; +var style = _dereq_("./style.js"); +var options = _dereq_("./options.js"); +var scopeManager = _dereq_("./scope-manager.js"); + +var JSHINT = (function() { + "use strict"; + + var api, // Extension API + bang = { + "<" : true, + "<=" : true, + "==" : true, + "===": true, + "!==": true, + "!=" : true, + ">" : true, + ">=" : true, + "+" : true, + "-" : true, + "*" : true, + "/" : true, + "%" : true + }, + + declared, // Globals that were declared using /*global ... */ syntax. + + functionicity = [ + "closure", "exception", "global", "label", + "outer", "unused", "var" + ], + + functions, // All of the functions + + inblock, + indent, + lookahead, + lex, + member, + membersOnly, + predefined, // Global variables defined by option + + stack, + urls, + + extraModules = [], + emitter = new events.EventEmitter(); + + function checkOption(name, t) { + name = name.trim(); + + if (/^[+-]W\d{3}$/g.test(name)) { + return true; + } + + if (options.validNames.indexOf(name) === -1) { + if (t.type !== "jslint" && !_.has(options.removed, name)) { + error("E001", t, name); + return false; + } + } + + return true; + } + + function isString(obj) { + return Object.prototype.toString.call(obj) === "[object String]"; + } + + function isIdentifier(tkn, value) { + if (!tkn) + return false; + + if (!tkn.identifier || tkn.value !== value) + return false; + + return true; + } + + function isReserved(token) { + if (!token.reserved) { + return false; + } + var meta = token.meta; + + if (meta && meta.isFutureReservedWord && state.inES5()) { + if (!meta.es5) { + return false; + } + if (meta.strictOnly) { + if (!state.option.strict && !state.isStrict()) { + return false; + } + } + + if (token.isProperty) { + return false; + } + } + + return true; + } + + function supplant(str, data) { + return str.replace(/\{([^{}]*)\}/g, function(a, b) { + var r = data[b]; + return typeof r === "string" || typeof r === "number" ? r : a; + }); + } + + function combine(dest, src) { + Object.keys(src).forEach(function(name) { + if (_.has(JSHINT.blacklist, name)) return; + dest[name] = src[name]; + }); + } + + function processenforceall() { + if (state.option.enforceall) { + for (var enforceopt in options.bool.enforcing) { + if (state.option[enforceopt] === undefined && + !options.noenforceall[enforceopt]) { + state.option[enforceopt] = true; + } + } + for (var relaxopt in options.bool.relaxing) { + if (state.option[relaxopt] === undefined) { + state.option[relaxopt] = false; + } + } + } + } + + function assume() { + processenforceall(); + if (!state.option.esversion && !state.option.moz) { + if (state.option.es3) { + state.option.esversion = 3; + } else if (state.option.esnext) { + state.option.esversion = 6; + } else { + state.option.esversion = 5; + } + } + + if (state.inES5()) { + combine(predefined, vars.ecmaIdentifiers[5]); + } + + if (state.inES6()) { + combine(predefined, vars.ecmaIdentifiers[6]); + } + + if (state.option.module) { + if (state.option.strict === true) { + state.option.strict = "global"; + } + if (!state.inES6()) { + warning("W134", state.tokens.next, "module", 6); + } + } + + if (state.option.couch) { + combine(predefined, vars.couch); + } + + if (state.option.qunit) { + combine(predefined, vars.qunit); + } + + if (state.option.rhino) { + combine(predefined, vars.rhino); + } + + if (state.option.shelljs) { + combine(predefined, vars.shelljs); + combine(predefined, vars.node); + } + if (state.option.typed) { + combine(predefined, vars.typed); + } + + if (state.option.phantom) { + combine(predefined, vars.phantom); + if (state.option.strict === true) { + state.option.strict = "global"; + } + } + + if (state.option.prototypejs) { + combine(predefined, vars.prototypejs); + } + + if (state.option.node) { + combine(predefined, vars.node); + combine(predefined, vars.typed); + if (state.option.strict === true) { + state.option.strict = "global"; + } + } + + if (state.option.devel) { + combine(predefined, vars.devel); + } + + if (state.option.dojo) { + combine(predefined, vars.dojo); + } + + if (state.option.browser) { + combine(predefined, vars.browser); + combine(predefined, vars.typed); + } + + if (state.option.browserify) { + combine(predefined, vars.browser); + combine(predefined, vars.typed); + combine(predefined, vars.browserify); + if (state.option.strict === true) { + state.option.strict = "global"; + } + } + + if (state.option.nonstandard) { + combine(predefined, vars.nonstandard); + } + + if (state.option.jasmine) { + combine(predefined, vars.jasmine); + } + + if (state.option.jquery) { + combine(predefined, vars.jquery); + } + + if (state.option.mootools) { + combine(predefined, vars.mootools); + } + + if (state.option.worker) { + combine(predefined, vars.worker); + } + + if (state.option.wsh) { + combine(predefined, vars.wsh); + } + + if (state.option.globalstrict && state.option.strict !== false) { + state.option.strict = "global"; + } + + if (state.option.yui) { + combine(predefined, vars.yui); + } + + if (state.option.mocha) { + combine(predefined, vars.mocha); + } + } + function quit(code, line, chr) { + var percentage = Math.floor((line / state.lines.length) * 100); + var message = messages.errors[code].desc; + + throw { + name: "JSHintError", + line: line, + character: chr, + message: message + " (" + percentage + "% scanned).", + raw: message, + code: code + }; + } + + function removeIgnoredMessages() { + var ignored = state.ignoredLines; + + if (_.isEmpty(ignored)) return; + JSHINT.errors = _.reject(JSHINT.errors, function(err) { return ignored[err.line] }); + } + + function warning(code, t, a, b, c, d) { + var ch, l, w, msg; + + if (/^W\d{3}$/.test(code)) { + if (state.ignored[code]) + return; + + msg = messages.warnings[code]; + } else if (/E\d{3}/.test(code)) { + msg = messages.errors[code]; + } else if (/I\d{3}/.test(code)) { + msg = messages.info[code]; + } + + t = t || state.tokens.next || {}; + if (t.id === "(end)") { // `~ + t = state.tokens.curr; + } + + l = t.line || 0; + ch = t.from || 0; + + w = { + id: "(error)", + raw: msg.desc, + code: msg.code, + evidence: state.lines[l - 1] || "", + line: l, + character: ch, + scope: JSHINT.scope, + a: a, + b: b, + c: c, + d: d + }; + + w.reason = supplant(msg.desc, w); + JSHINT.errors.push(w); + + removeIgnoredMessages(); + + if (JSHINT.errors.length >= state.option.maxerr) + quit("E043", l, ch); + + return w; + } + + function warningAt(m, l, ch, a, b, c, d) { + return warning(m, { + line: l, + from: ch + }, a, b, c, d); + } + + function error(m, t, a, b, c, d) { + warning(m, t, a, b, c, d); + } + + function errorAt(m, l, ch, a, b, c, d) { + return error(m, { + line: l, + from: ch + }, a, b, c, d); + } + function addInternalSrc(elem, src) { + var i; + i = { + id: "(internal)", + elem: elem, + value: src + }; + JSHINT.internals.push(i); + return i; + } + + function doOption() { + var nt = state.tokens.next; + var body = nt.body.match(/(-\s+)?[^\s,:]+(?:\s*:\s*(-\s+)?[^\s,]+)?/g) || []; + + var predef = {}; + if (nt.type === "globals") { + body.forEach(function(g, idx) { + g = g.split(":"); + var key = (g[0] || "").trim(); + var val = (g[1] || "").trim(); + + if (key === "-" || !key.length) { + if (idx > 0 && idx === body.length - 1) { + return; + } + error("E002", nt); + return; + } + + if (key.charAt(0) === "-") { + key = key.slice(1); + val = false; + + JSHINT.blacklist[key] = key; + delete predefined[key]; + } else { + predef[key] = (val === "true"); + } + }); + + combine(predefined, predef); + + for (var key in predef) { + if (_.has(predef, key)) { + declared[key] = nt; + } + } + } + + if (nt.type === "exported") { + body.forEach(function(e, idx) { + if (!e.length) { + if (idx > 0 && idx === body.length - 1) { + return; + } + error("E002", nt); + return; + } + + state.funct["(scope)"].addExported(e); + }); + } + + if (nt.type === "members") { + membersOnly = membersOnly || {}; + + body.forEach(function(m) { + var ch1 = m.charAt(0); + var ch2 = m.charAt(m.length - 1); + + if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) { + m = m + .substr(1, m.length - 2) + .replace("\\\"", "\""); + } + + membersOnly[m] = false; + }); + } + + var numvals = [ + "maxstatements", + "maxparams", + "maxdepth", + "maxcomplexity", + "maxerr", + "maxlen", + "indent" + ]; + + if (nt.type === "jshint" || nt.type === "jslint") { + body.forEach(function(g) { + g = g.split(":"); + var key = (g[0] || "").trim(); + var val = (g[1] || "").trim(); + + if (!checkOption(key, nt)) { + return; + } + + if (numvals.indexOf(key) >= 0) { + if (val !== "false") { + val = +val; + + if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) { + error("E032", nt, g[1].trim()); + return; + } + + state.option[key] = val; + } else { + state.option[key] = key === "indent" ? 4 : false; + } + + return; + } + + if (key === "validthis") { + + if (state.funct["(global)"]) + return void error("E009"); + + if (val !== "true" && val !== "false") + return void error("E002", nt); + + state.option.validthis = (val === "true"); + return; + } + + if (key === "quotmark") { + switch (val) { + case "true": + case "false": + state.option.quotmark = (val === "true"); + break; + case "double": + case "single": + state.option.quotmark = val; + break; + default: + error("E002", nt); + } + return; + } + + if (key === "shadow") { + switch (val) { + case "true": + state.option.shadow = true; + break; + case "outer": + state.option.shadow = "outer"; + break; + case "false": + case "inner": + state.option.shadow = "inner"; + break; + default: + error("E002", nt); + } + return; + } + + if (key === "unused") { + switch (val) { + case "true": + state.option.unused = true; + break; + case "false": + state.option.unused = false; + break; + case "vars": + case "strict": + state.option.unused = val; + break; + default: + error("E002", nt); + } + return; + } + + if (key === "latedef") { + switch (val) { + case "true": + state.option.latedef = true; + break; + case "false": + state.option.latedef = false; + break; + case "nofunc": + state.option.latedef = "nofunc"; + break; + default: + error("E002", nt); + } + return; + } + + if (key === "ignore") { + switch (val) { + case "line": + state.ignoredLines[nt.line] = true; + removeIgnoredMessages(); + break; + default: + error("E002", nt); + } + return; + } + + if (key === "strict") { + switch (val) { + case "true": + state.option.strict = true; + break; + case "false": + state.option.strict = false; + break; + case "func": + case "global": + case "implied": + state.option.strict = val; + break; + default: + error("E002", nt); + } + return; + } + + if (key === "module") { + if (!hasParsedCode(state.funct)) { + error("E055", state.tokens.next, "module"); + } + } + var esversions = { + es3 : 3, + es5 : 5, + esnext: 6 + }; + if (_.has(esversions, key)) { + switch (val) { + case "true": + state.option.moz = false; + state.option.esversion = esversions[key]; + break; + case "false": + if (!state.option.moz) { + state.option.esversion = 5; + } + break; + default: + error("E002", nt); + } + return; + } + + if (key === "esversion") { + switch (val) { + case "5": + if (state.inES5(true)) { + warning("I003"); + } + case "3": + case "6": + state.option.moz = false; + state.option.esversion = +val; + break; + case "2015": + state.option.moz = false; + state.option.esversion = 6; + break; + default: + error("E002", nt); + } + if (!hasParsedCode(state.funct)) { + error("E055", state.tokens.next, "esversion"); + } + return; + } + + var match = /^([+-])(W\d{3})$/g.exec(key); + if (match) { + state.ignored[match[2]] = (match[1] === "-"); + return; + } + + var tn; + if (val === "true" || val === "false") { + if (nt.type === "jslint") { + tn = options.renamed[key] || key; + state.option[tn] = (val === "true"); + + if (options.inverted[tn] !== undefined) { + state.option[tn] = !state.option[tn]; + } + } else { + state.option[key] = (val === "true"); + } + + if (key === "newcap") { + state.option["(explicitNewcap)"] = true; + } + return; + } + + error("E002", nt); + }); + + assume(); + } + } + + function peek(p) { + var i = p || 0, j = lookahead.length, t; + + if (i < j) { + return lookahead[i]; + } + + while (j <= i) { + t = lookahead[j]; + if (!t) { + t = lookahead[j] = lex.token(); + } + j += 1; + } + if (!t && state.tokens.next.id === "(end)") { + return state.tokens.next; + } + + return t; + } + + function peekIgnoreEOL() { + var i = 0; + var t; + do { + t = peek(i++); + } while (t.id === "(endline)"); + return t; + } + + function advance(id, t) { + + switch (state.tokens.curr.id) { + case "(number)": + if (state.tokens.next.id === ".") { + warning("W005", state.tokens.curr); + } + break; + case "-": + if (state.tokens.next.id === "-" || state.tokens.next.id === "--") { + warning("W006"); + } + break; + case "+": + if (state.tokens.next.id === "+" || state.tokens.next.id === "++") { + warning("W007"); + } + break; + } + + if (id && state.tokens.next.id !== id) { + if (t) { + if (state.tokens.next.id === "(end)") { + error("E019", t, t.id); + } else { + error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value); + } + } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) { + warning("W116", state.tokens.next, id, state.tokens.next.value); + } + } + + state.tokens.prev = state.tokens.curr; + state.tokens.curr = state.tokens.next; + for (;;) { + state.tokens.next = lookahead.shift() || lex.token(); + + if (!state.tokens.next) { // No more tokens left, give up + quit("E041", state.tokens.curr.line); + } + + if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") { + return; + } + + if (state.tokens.next.check) { + state.tokens.next.check(); + } + + if (state.tokens.next.isSpecial) { + if (state.tokens.next.type === "falls through") { + state.tokens.curr.caseFallsThrough = true; + } else { + doOption(); + } + } else { + if (state.tokens.next.id !== "(endline)") { + break; + } + } + } + } + + function isInfix(token) { + return token.infix || (!token.identifier && !token.template && !!token.led); + } + + function isEndOfExpr() { + var curr = state.tokens.curr; + var next = state.tokens.next; + if (next.id === ";" || next.id === "}" || next.id === ":") { + return true; + } + if (isInfix(next) === isInfix(curr) || (curr.id === "yield" && state.inMoz())) { + return curr.line !== startLine(next); + } + return false; + } + + function isBeginOfExpr(prev) { + return !prev.left && prev.arity !== "unary"; + } + + function expression(rbp, initial) { + var left, isArray = false, isObject = false, isLetExpr = false; + + state.nameStack.push(); + if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") { + if (!state.inMoz()) { + warning("W118", state.tokens.next, "let expressions"); + } + isLetExpr = true; + state.funct["(scope)"].stack(); + advance("let"); + advance("("); + state.tokens.prev.fud(); + advance(")"); + } + + if (state.tokens.next.id === "(end)") + error("E006", state.tokens.curr); + + var isDangerous = + state.option.asi && + state.tokens.prev.line !== startLine(state.tokens.curr) && + _.contains(["]", ")"], state.tokens.prev.id) && + _.contains(["[", "("], state.tokens.curr.id); + + if (isDangerous) + warning("W014", state.tokens.curr, state.tokens.curr.id); + + advance(); + + if (initial) { + state.funct["(verb)"] = state.tokens.curr.value; + state.tokens.curr.beginsStmt = true; + } + + if (initial === true && state.tokens.curr.fud) { + left = state.tokens.curr.fud(); + } else { + if (state.tokens.curr.nud) { + left = state.tokens.curr.nud(); + } else { + error("E030", state.tokens.curr, state.tokens.curr.id); + } + while ((rbp < state.tokens.next.lbp || state.tokens.next.type === "(template)") && + !isEndOfExpr()) { + isArray = state.tokens.curr.value === "Array"; + isObject = state.tokens.curr.value === "Object"; + if (left && (left.value || (left.first && left.first.value))) { + if (left.value !== "new" || + (left.first && left.first.value && left.first.value === ".")) { + isArray = false; + if (left.value !== state.tokens.curr.value) { + isObject = false; + } + } + } + + advance(); + + if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { + warning("W009", state.tokens.curr); + } + + if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { + warning("W010", state.tokens.curr); + } + + if (left && state.tokens.curr.led) { + left = state.tokens.curr.led(left); + } else { + error("E033", state.tokens.curr, state.tokens.curr.id); + } + } + } + if (isLetExpr) { + state.funct["(scope)"].unstack(); + } + + state.nameStack.pop(); + + return left; + } + + function startLine(token) { + return token.startLine || token.line; + } + + function nobreaknonadjacent(left, right) { + left = left || state.tokens.curr; + right = right || state.tokens.next; + if (!state.option.laxbreak && left.line !== startLine(right)) { + warning("W014", right, right.value); + } + } + + function nolinebreak(t) { + t = t || state.tokens.curr; + if (t.line !== startLine(state.tokens.next)) { + warning("E022", t, t.value); + } + } + + function nobreakcomma(left, right) { + if (left.line !== startLine(right)) { + if (!state.option.laxcomma) { + if (comma.first) { + warning("I001"); + comma.first = false; + } + warning("W014", left, right.value); + } + } + } + + function comma(opts) { + opts = opts || {}; + + if (!opts.peek) { + nobreakcomma(state.tokens.curr, state.tokens.next); + advance(","); + } else { + nobreakcomma(state.tokens.prev, state.tokens.curr); + } + + if (state.tokens.next.identifier && !(opts.property && state.inES5())) { + switch (state.tokens.next.value) { + case "break": + case "case": + case "catch": + case "continue": + case "default": + case "do": + case "else": + case "finally": + case "for": + case "if": + case "in": + case "instanceof": + case "return": + case "switch": + case "throw": + case "try": + case "var": + case "let": + case "while": + case "with": + error("E024", state.tokens.next, state.tokens.next.value); + return false; + } + } + + if (state.tokens.next.type === "(punctuator)") { + switch (state.tokens.next.value) { + case "}": + case "]": + case ",": + if (opts.allowTrailing) { + return true; + } + case ")": + error("E024", state.tokens.next, state.tokens.next.value); + return false; + } + } + return true; + } + + function symbol(s, p) { + var x = state.syntax[s]; + if (!x || typeof x !== "object") { + state.syntax[s] = x = { + id: s, + lbp: p, + value: s + }; + } + return x; + } + + function delim(s) { + var x = symbol(s, 0); + x.delim = true; + return x; + } + + function stmt(s, f) { + var x = delim(s); + x.identifier = x.reserved = true; + x.fud = f; + return x; + } + + function blockstmt(s, f) { + var x = stmt(s, f); + x.block = true; + return x; + } + + function reserveName(x) { + var c = x.id.charAt(0); + if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { + x.identifier = x.reserved = true; + } + return x; + } + + function prefix(s, f) { + var x = symbol(s, 150); + reserveName(x); + + x.nud = (typeof f === "function") ? f : function() { + this.arity = "unary"; + this.right = expression(150); + + if (this.id === "++" || this.id === "--") { + if (state.option.plusplus) { + warning("W016", this, this.id); + } else if (this.right && (!this.right.identifier || isReserved(this.right)) && + this.right.id !== "." && this.right.id !== "[") { + warning("W017", this); + } + + if (this.right && this.right.isMetaProperty) { + error("E031", this); + } else if (this.right && this.right.identifier) { + state.funct["(scope)"].block.modify(this.right.value, this); + } + } + + return this; + }; + + return x; + } + + function type(s, f) { + var x = delim(s); + x.type = s; + x.nud = f; + return x; + } + + function reserve(name, func) { + var x = type(name, func); + x.identifier = true; + x.reserved = true; + return x; + } + + function FutureReservedWord(name, meta) { + var x = type(name, (meta && meta.nud) || function() { + return this; + }); + + meta = meta || {}; + meta.isFutureReservedWord = true; + + x.value = name; + x.identifier = true; + x.reserved = true; + x.meta = meta; + + return x; + } + + function reservevar(s, v) { + return reserve(s, function() { + if (typeof v === "function") { + v(this); + } + return this; + }); + } + + function infix(s, f, p, w) { + var x = symbol(s, p); + reserveName(x); + x.infix = true; + x.led = function(left) { + if (!w) { + nobreaknonadjacent(state.tokens.prev, state.tokens.curr); + } + if ((s === "in" || s === "instanceof") && left.id === "!") { + warning("W018", left, "!"); + } + if (typeof f === "function") { + return f(left, this); + } else { + this.left = left; + this.right = expression(p); + return this; + } + }; + return x; + } + + function application(s) { + var x = symbol(s, 42); + + x.led = function(left) { + nobreaknonadjacent(state.tokens.prev, state.tokens.curr); + + this.left = left; + this.right = doFunction({ type: "arrow", loneArg: left }); + return this; + }; + return x; + } + + function relation(s, f) { + var x = symbol(s, 100); + + x.led = function(left) { + nobreaknonadjacent(state.tokens.prev, state.tokens.curr); + this.left = left; + var right = this.right = expression(100); + + if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) { + warning("W019", this); + } else if (f) { + f.apply(this, [left, right]); + } + + if (!left || !right) { + quit("E041", state.tokens.curr.line); + } + + if (left.id === "!") { + warning("W018", left, "!"); + } + + if (right.id === "!") { + warning("W018", right, "!"); + } + + return this; + }; + return x; + } + + function isPoorRelation(node) { + return node && + ((node.type === "(number)" && +node.value === 0) || + (node.type === "(string)" && node.value === "") || + (node.type === "null" && !state.option.eqnull) || + node.type === "true" || + node.type === "false" || + node.type === "undefined"); + } + + var typeofValues = {}; + typeofValues.legacy = [ + "xml", + "unknown" + ]; + typeofValues.es3 = [ + "undefined", "boolean", "number", "string", "function", "object", + ]; + typeofValues.es3 = typeofValues.es3.concat(typeofValues.legacy); + typeofValues.es6 = typeofValues.es3.concat("symbol"); + function isTypoTypeof(left, right, state) { + var values; + + if (state.option.notypeof) + return false; + + if (!left || !right) + return false; + + values = state.inES6() ? typeofValues.es6 : typeofValues.es3; + + if (right.type === "(identifier)" && right.value === "typeof" && left.type === "(string)") + return !_.contains(values, left.value); + + return false; + } + + function isGlobalEval(left, state) { + var isGlobal = false; + if (left.type === "this" && state.funct["(context)"] === null) { + isGlobal = true; + } + else if (left.type === "(identifier)") { + if (state.option.node && left.value === "global") { + isGlobal = true; + } + + else if (state.option.browser && (left.value === "window" || left.value === "document")) { + isGlobal = true; + } + } + + return isGlobal; + } + + function findNativePrototype(left) { + var natives = [ + "Array", "ArrayBuffer", "Boolean", "Collator", "DataView", "Date", + "DateTimeFormat", "Error", "EvalError", "Float32Array", "Float64Array", + "Function", "Infinity", "Intl", "Int16Array", "Int32Array", "Int8Array", + "Iterator", "Number", "NumberFormat", "Object", "RangeError", + "ReferenceError", "RegExp", "StopIteration", "String", "SyntaxError", + "TypeError", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", + "URIError" + ]; + + function walkPrototype(obj) { + if (typeof obj !== "object") return; + return obj.right === "prototype" ? obj : walkPrototype(obj.left); + } + + function walkNative(obj) { + while (!obj.identifier && typeof obj.left === "object") + obj = obj.left; + + if (obj.identifier && natives.indexOf(obj.value) >= 0) + return obj.value; + } + + var prototype = walkPrototype(left); + if (prototype) return walkNative(prototype); + } + function checkLeftSideAssign(left, assignToken, options) { + + var allowDestructuring = options && options.allowDestructuring; + + assignToken = assignToken || left; + + if (state.option.freeze) { + var nativeObject = findNativePrototype(left); + if (nativeObject) + warning("W121", left, nativeObject); + } + + if (left.identifier && !left.isMetaProperty) { + state.funct["(scope)"].block.reassign(left.value, left); + } + + if (left.id === ".") { + if (!left.left || left.left.value === "arguments" && !state.isStrict()) { + warning("E031", assignToken); + } + + state.nameStack.set(state.tokens.prev); + return true; + } else if (left.id === "{" || left.id === "[") { + if (allowDestructuring && state.tokens.curr.left.destructAssign) { + state.tokens.curr.left.destructAssign.forEach(function(t) { + if (t.id) { + state.funct["(scope)"].block.modify(t.id, t.token); + } + }); + } else { + if (left.id === "{" || !left.left) { + warning("E031", assignToken); + } else if (left.left.value === "arguments" && !state.isStrict()) { + warning("E031", assignToken); + } + } + + if (left.id === "[") { + state.nameStack.set(left.right); + } + + return true; + } else if (left.isMetaProperty) { + error("E031", assignToken); + return true; + } else if (left.identifier && !isReserved(left)) { + if (state.funct["(scope)"].labeltype(left.value) === "exception") { + warning("W022", left); + } + state.nameStack.set(left); + return true; + } + + if (left === state.syntax["function"]) { + warning("W023", state.tokens.curr); + } + + return false; + } + + function assignop(s, f, p) { + var x = infix(s, typeof f === "function" ? f : function(left, that) { + that.left = left; + + if (left && checkLeftSideAssign(left, that, { allowDestructuring: true })) { + that.right = expression(10); + return that; + } + + error("E031", that); + }, p); + + x.exps = true; + x.assign = true; + return x; + } + + + function bitwise(s, f, p) { + var x = symbol(s, p); + reserveName(x); + x.led = (typeof f === "function") ? f : function(left) { + if (state.option.bitwise) { + warning("W016", this, this.id); + } + this.left = left; + this.right = expression(p); + return this; + }; + return x; + } + + function bitwiseassignop(s) { + return assignop(s, function(left, that) { + if (state.option.bitwise) { + warning("W016", that, that.id); + } + + if (left && checkLeftSideAssign(left, that)) { + that.right = expression(10); + return that; + } + error("E031", that); + }, 20); + } + + function suffix(s) { + var x = symbol(s, 150); + + x.led = function(left) { + if (state.option.plusplus) { + warning("W016", this, this.id); + } else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") { + warning("W017", this); + } + + if (left.isMetaProperty) { + error("E031", this); + } else if (left && left.identifier) { + state.funct["(scope)"].block.modify(left.value, left); + } + + this.left = left; + return this; + }; + return x; + } + + function optionalidentifier(fnparam, prop, preserve) { + if (!state.tokens.next.identifier) { + return; + } + + if (!preserve) { + advance(); + } + + var curr = state.tokens.curr; + var val = state.tokens.curr.value; + + if (!isReserved(curr)) { + return val; + } + + if (prop) { + if (state.inES5()) { + return val; + } + } + + if (fnparam && val === "undefined") { + return val; + } + + warning("W024", state.tokens.curr, state.tokens.curr.id); + return val; + } + function identifier(fnparam, prop) { + var i = optionalidentifier(fnparam, prop, false); + if (i) { + return i; + } + if (state.tokens.next.value === "...") { + if (!state.inES6(true)) { + warning("W119", state.tokens.next, "spread/rest operator", "6"); + } + advance(); + + if (checkPunctuator(state.tokens.next, "...")) { + warning("E024", state.tokens.next, "..."); + while (checkPunctuator(state.tokens.next, "...")) { + advance(); + } + } + + if (!state.tokens.next.identifier) { + warning("E024", state.tokens.curr, "..."); + return; + } + + return identifier(fnparam, prop); + } else { + error("E030", state.tokens.next, state.tokens.next.value); + if (state.tokens.next.id !== ";") { + advance(); + } + } + } + + + function reachable(controlToken) { + var i = 0, t; + if (state.tokens.next.id !== ";" || controlToken.inBracelessBlock) { + return; + } + for (;;) { + do { + t = peek(i); + i += 1; + } while (t.id !== "(end)" && t.id === "(comment)"); + + if (t.reach) { + return; + } + if (t.id !== "(endline)") { + if (t.id === "function") { + if (state.option.latedef === true) { + warning("W026", t); + } + break; + } + + warning("W027", t, t.value, controlToken.value); + break; + } + } + } + + function parseFinalSemicolon() { + if (state.tokens.next.id !== ";") { + if (state.tokens.next.isUnclosed) return advance(); + + var sameLine = startLine(state.tokens.next) === state.tokens.curr.line && + state.tokens.next.id !== "(end)"; + var blockEnd = checkPunctuator(state.tokens.next, "}"); + + if (sameLine && !blockEnd) { + errorAt("E058", state.tokens.curr.line, state.tokens.curr.character); + } else if (!state.option.asi) { + if ((blockEnd && !state.option.lastsemic) || !sameLine) { + warningAt("W033", state.tokens.curr.line, state.tokens.curr.character); + } + } + } else { + advance(";"); + } + } + + function statement() { + var i = indent, r, t = state.tokens.next, hasOwnScope = false; + + if (t.id === ";") { + advance(";"); + return; + } + var res = isReserved(t); + + if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") { + warning("W024", t, t.id); + res = false; + } + + if (t.identifier && !res && peek().id === ":") { + advance(); + advance(":"); + + hasOwnScope = true; + state.funct["(scope)"].stack(); + state.funct["(scope)"].block.addBreakLabel(t.value, { token: state.tokens.curr }); + + if (!state.tokens.next.labelled && state.tokens.next.value !== "{") { + warning("W028", state.tokens.next, t.value, state.tokens.next.value); + } + + state.tokens.next.label = t.value; + t = state.tokens.next; + } + + if (t.id === "{") { + var iscase = (state.funct["(verb)"] === "case" && state.tokens.curr.value === ":"); + block(true, true, false, false, iscase); + return; + } + + r = expression(0, true); + + if (r && !(r.identifier && r.value === "function") && + !(r.type === "(punctuator)" && r.left && + r.left.identifier && r.left.value === "function")) { + if (!state.isStrict() && + state.option.strict === "global") { + warning("E007"); + } + } + + if (!t.block) { + if (!state.option.expr && (!r || !r.exps)) { + warning("W030", state.tokens.curr); + } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") { + warning("W031", t); + } + parseFinalSemicolon(); + } + + indent = i; + if (hasOwnScope) { + state.funct["(scope)"].unstack(); + } + return r; + } + + + function statements() { + var a = [], p; + + while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") { + if (state.tokens.next.id === ";") { + p = peek(); + + if (!p || (p.id !== "(" && p.id !== "[")) { + warning("W032"); + } + + advance(";"); + } else { + a.push(statement()); + } + } + return a; + } + function directives() { + var i, p, pn; + + while (state.tokens.next.id === "(string)") { + p = peek(0); + if (p.id === "(endline)") { + i = 1; + do { + pn = peek(i++); + } while (pn.id === "(endline)"); + if (pn.id === ";") { + p = pn; + } else if (pn.value === "[" || pn.value === ".") { + break; + } else if (!state.option.asi || pn.value === "(") { + warning("W033", state.tokens.next); + } + } else if (p.id === "." || p.id === "[") { + break; + } else if (p.id !== ";") { + warning("W033", p); + } + + advance(); + var directive = state.tokens.curr.value; + if (state.directive[directive] || + (directive === "use strict" && state.option.strict === "implied")) { + warning("W034", state.tokens.curr, directive); + } + state.directive[directive] = true; + + if (p.id === ";") { + advance(";"); + } + } + + if (state.isStrict()) { + if (!state.option["(explicitNewcap)"]) { + state.option.newcap = true; + } + state.option.undef = true; + } + } + function block(ordinary, stmt, isfunc, isfatarrow, iscase) { + var a, + b = inblock, + old_indent = indent, + m, + t, + line, + d; + + inblock = ordinary; + + t = state.tokens.next; + + var metrics = state.funct["(metrics)"]; + metrics.nestedBlockDepth += 1; + metrics.verifyMaxNestedBlockDepthPerFunction(); + + if (state.tokens.next.id === "{") { + advance("{"); + state.funct["(scope)"].stack(); + + line = state.tokens.curr.line; + if (state.tokens.next.id !== "}") { + indent += state.option.indent; + while (!ordinary && state.tokens.next.from > indent) { + indent += state.option.indent; + } + + if (isfunc) { + m = {}; + for (d in state.directive) { + if (_.has(state.directive, d)) { + m[d] = state.directive[d]; + } + } + directives(); + + if (state.option.strict && state.funct["(context)"]["(global)"]) { + if (!m["use strict"] && !state.isStrict()) { + warning("E007"); + } + } + } + + a = statements(); + + metrics.statementCount += a.length; + + indent -= state.option.indent; + } + + advance("}", t); + + if (isfunc) { + state.funct["(scope)"].validateParams(); + if (m) { + state.directive = m; + } + } + + state.funct["(scope)"].unstack(); + + indent = old_indent; + } else if (!ordinary) { + if (isfunc) { + state.funct["(scope)"].stack(); + + m = {}; + if (stmt && !isfatarrow && !state.inMoz()) { + error("W118", state.tokens.curr, "function closure expressions"); + } + + if (!stmt) { + for (d in state.directive) { + if (_.has(state.directive, d)) { + m[d] = state.directive[d]; + } + } + } + expression(10); + + if (state.option.strict && state.funct["(context)"]["(global)"]) { + if (!m["use strict"] && !state.isStrict()) { + warning("E007"); + } + } + + state.funct["(scope)"].unstack(); + } else { + error("E021", state.tokens.next, "{", state.tokens.next.value); + } + } else { + state.funct["(noblockscopedvar)"] = state.tokens.next.id !== "for"; + state.funct["(scope)"].stack(); + + if (!stmt || state.option.curly) { + warning("W116", state.tokens.next, "{", state.tokens.next.value); + } + + state.tokens.next.inBracelessBlock = true; + indent += state.option.indent; + a = [statement()]; + indent -= state.option.indent; + + state.funct["(scope)"].unstack(); + delete state.funct["(noblockscopedvar)"]; + } + switch (state.funct["(verb)"]) { + case "break": + case "continue": + case "return": + case "throw": + if (iscase) { + break; + } + default: + state.funct["(verb)"] = null; + } + + inblock = b; + if (ordinary && state.option.noempty && (!a || a.length === 0)) { + warning("W035", state.tokens.prev); + } + metrics.nestedBlockDepth -= 1; + return a; + } + + + function countMember(m) { + if (membersOnly && typeof membersOnly[m] !== "boolean") { + warning("W036", state.tokens.curr, m); + } + if (typeof member[m] === "number") { + member[m] += 1; + } else { + member[m] = 1; + } + } + + type("(number)", function() { + return this; + }); + + type("(string)", function() { + return this; + }); + + state.syntax["(identifier)"] = { + type: "(identifier)", + lbp: 0, + identifier: true, + + nud: function() { + var v = this.value; + if (state.tokens.next.id === "=>") { + return this; + } + + if (!state.funct["(comparray)"].check(v)) { + state.funct["(scope)"].block.use(v, state.tokens.curr); + } + return this; + }, + + led: function() { + error("E033", state.tokens.next, state.tokens.next.value); + } + }; + + var baseTemplateSyntax = { + lbp: 0, + identifier: false, + template: true, + }; + state.syntax["(template)"] = _.extend({ + type: "(template)", + nud: doTemplateLiteral, + led: doTemplateLiteral, + noSubst: false + }, baseTemplateSyntax); + + state.syntax["(template middle)"] = _.extend({ + type: "(template middle)", + middle: true, + noSubst: false + }, baseTemplateSyntax); + + state.syntax["(template tail)"] = _.extend({ + type: "(template tail)", + tail: true, + noSubst: false + }, baseTemplateSyntax); + + state.syntax["(no subst template)"] = _.extend({ + type: "(template)", + nud: doTemplateLiteral, + led: doTemplateLiteral, + noSubst: true, + tail: true // mark as tail, since it's always the last component + }, baseTemplateSyntax); + + type("(regexp)", function() { + return this; + }); + + delim("(endline)"); + delim("(begin)"); + delim("(end)").reach = true; + delim("(error)").reach = true; + delim("}").reach = true; + delim(")"); + delim("]"); + delim("\"").reach = true; + delim("'").reach = true; + delim(";"); + delim(":").reach = true; + delim("#"); + + reserve("else"); + reserve("case").reach = true; + reserve("catch"); + reserve("default").reach = true; + reserve("finally"); + reservevar("arguments", function(x) { + if (state.isStrict() && state.funct["(global)"]) { + warning("E008", x); + } + }); + reservevar("eval"); + reservevar("false"); + reservevar("Infinity"); + reservevar("null"); + reservevar("this", function(x) { + if (state.isStrict() && !isMethod() && + !state.option.validthis && ((state.funct["(statement)"] && + state.funct["(name)"].charAt(0) > "Z") || state.funct["(global)"])) { + warning("W040", x); + } + }); + reservevar("true"); + reservevar("undefined"); + + assignop("=", "assign", 20); + assignop("+=", "assignadd", 20); + assignop("-=", "assignsub", 20); + assignop("*=", "assignmult", 20); + assignop("/=", "assigndiv", 20).nud = function() { + error("E014"); + }; + assignop("%=", "assignmod", 20); + + bitwiseassignop("&="); + bitwiseassignop("|="); + bitwiseassignop("^="); + bitwiseassignop("<<="); + bitwiseassignop(">>="); + bitwiseassignop(">>>="); + infix(",", function(left, that) { + var expr; + that.exprs = [left]; + + if (state.option.nocomma) { + warning("W127"); + } + + if (!comma({ peek: true })) { + return that; + } + while (true) { + if (!(expr = expression(10))) { + break; + } + that.exprs.push(expr); + if (state.tokens.next.value !== "," || !comma()) { + break; + } + } + return that; + }, 10, true); + + infix("?", function(left, that) { + increaseComplexityCount(); + that.left = left; + that.right = expression(10); + advance(":"); + that["else"] = expression(10); + return that; + }, 30); + + var orPrecendence = 40; + infix("||", function(left, that) { + increaseComplexityCount(); + that.left = left; + that.right = expression(orPrecendence); + return that; + }, orPrecendence); + infix("&&", "and", 50); + bitwise("|", "bitor", 70); + bitwise("^", "bitxor", 80); + bitwise("&", "bitand", 90); + relation("==", function(left, right) { + var eqnull = state.option.eqnull && + ((left && left.value) === "null" || (right && right.value) === "null"); + + switch (true) { + case !eqnull && state.option.eqeqeq: + this.from = this.character; + warning("W116", this, "===", "=="); + break; + case isPoorRelation(left): + warning("W041", this, "===", left.value); + break; + case isPoorRelation(right): + warning("W041", this, "===", right.value); + break; + case isTypoTypeof(right, left, state): + warning("W122", this, right.value); + break; + case isTypoTypeof(left, right, state): + warning("W122", this, left.value); + break; + } + + return this; + }); + relation("===", function(left, right) { + if (isTypoTypeof(right, left, state)) { + warning("W122", this, right.value); + } else if (isTypoTypeof(left, right, state)) { + warning("W122", this, left.value); + } + return this; + }); + relation("!=", function(left, right) { + var eqnull = state.option.eqnull && + ((left && left.value) === "null" || (right && right.value) === "null"); + + if (!eqnull && state.option.eqeqeq) { + this.from = this.character; + warning("W116", this, "!==", "!="); + } else if (isPoorRelation(left)) { + warning("W041", this, "!==", left.value); + } else if (isPoorRelation(right)) { + warning("W041", this, "!==", right.value); + } else if (isTypoTypeof(right, left, state)) { + warning("W122", this, right.value); + } else if (isTypoTypeof(left, right, state)) { + warning("W122", this, left.value); + } + return this; + }); + relation("!==", function(left, right) { + if (isTypoTypeof(right, left, state)) { + warning("W122", this, right.value); + } else if (isTypoTypeof(left, right, state)) { + warning("W122", this, left.value); + } + return this; + }); + relation("<"); + relation(">"); + relation("<="); + relation(">="); + bitwise("<<", "shiftleft", 120); + bitwise(">>", "shiftright", 120); + bitwise(">>>", "shiftrightunsigned", 120); + infix("in", "in", 120); + infix("instanceof", "instanceof", 120); + infix("+", function(left, that) { + var right; + that.left = left; + that.right = right = expression(130); + + if (left && right && left.id === "(string)" && right.id === "(string)") { + left.value += right.value; + left.character = right.character; + if (!state.option.scripturl && reg.javascriptURL.test(left.value)) { + warning("W050", left); + } + return left; + } + + return that; + }, 130); + prefix("+", "num"); + prefix("+++", function() { + warning("W007"); + this.arity = "unary"; + this.right = expression(150); + return this; + }); + infix("+++", function(left) { + warning("W007"); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix("-", "sub", 130); + prefix("-", "neg"); + prefix("---", function() { + warning("W006"); + this.arity = "unary"; + this.right = expression(150); + return this; + }); + infix("---", function(left) { + warning("W006"); + this.left = left; + this.right = expression(130); + return this; + }, 130); + infix("*", "mult", 140); + infix("/", "div", 140); + infix("%", "mod", 140); + + suffix("++"); + prefix("++", "preinc"); + state.syntax["++"].exps = true; + + suffix("--"); + prefix("--", "predec"); + state.syntax["--"].exps = true; + prefix("delete", function() { + var p = expression(10); + if (!p) { + return this; + } + + if (p.id !== "." && p.id !== "[") { + warning("W051"); + } + this.first = p; + if (p.identifier && !state.isStrict()) { + p.forgiveUndef = true; + } + return this; + }).exps = true; + + prefix("~", function() { + if (state.option.bitwise) { + warning("W016", this, "~"); + } + this.arity = "unary"; + this.right = expression(150); + return this; + }); + + prefix("...", function() { + if (!state.inES6(true)) { + warning("W119", this, "spread/rest operator", "6"); + } + if (!state.tokens.next.identifier && + state.tokens.next.type !== "(string)" && + !checkPunctuators(state.tokens.next, ["[", "("])) { + + error("E030", state.tokens.next, state.tokens.next.value); + } + expression(150); + return this; + }); + + prefix("!", function() { + this.arity = "unary"; + this.right = expression(150); + + if (!this.right) { // '!' followed by nothing? Give up. + quit("E041", this.line || 0); + } + + if (bang[this.right.id] === true) { + warning("W018", this, "!"); + } + return this; + }); + + prefix("typeof", (function() { + var p = expression(150); + this.first = this.right = p; + + if (!p) { // 'typeof' followed by nothing? Give up. + quit("E041", this.line || 0, this.character || 0); + } + if (p.identifier) { + p.forgiveUndef = true; + } + return this; + })); + prefix("new", function() { + var mp = metaProperty("target", function() { + if (!state.inES6(true)) { + warning("W119", state.tokens.prev, "new.target", "6"); + } + var inFunction, c = state.funct; + while (c) { + inFunction = !c["(global)"]; + if (!c["(arrow)"]) { break; } + c = c["(context)"]; + } + if (!inFunction) { + warning("W136", state.tokens.prev, "new.target"); + } + }); + if (mp) { return mp; } + + var c = expression(155), i; + if (c && c.id !== "function") { + if (c.identifier) { + c["new"] = true; + switch (c.value) { + case "Number": + case "String": + case "Boolean": + case "Math": + case "JSON": + warning("W053", state.tokens.prev, c.value); + break; + case "Symbol": + if (state.inES6()) { + warning("W053", state.tokens.prev, c.value); + } + break; + case "Function": + if (!state.option.evil) { + warning("W054"); + } + break; + case "Date": + case "RegExp": + case "this": + break; + default: + if (c.id !== "function") { + i = c.value.substr(0, 1); + if (state.option.newcap && (i < "A" || i > "Z") && + !state.funct["(scope)"].isPredefined(c.value)) { + warning("W055", state.tokens.curr); + } + } + } + } else { + if (c.id !== "." && c.id !== "[" && c.id !== "(") { + warning("W056", state.tokens.curr); + } + } + } else { + if (!state.option.supernew) + warning("W057", this); + } + if (state.tokens.next.id !== "(" && !state.option.supernew) { + warning("W058", state.tokens.curr, state.tokens.curr.value); + } + this.first = this.right = c; + return this; + }); + state.syntax["new"].exps = true; + + prefix("void").exps = true; + + infix(".", function(left, that) { + var m = identifier(false, true); + + if (typeof m === "string") { + countMember(m); + } + + that.left = left; + that.right = m; + + if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") { + warning("W001"); + } + + if (left && left.value === "arguments" && (m === "callee" || m === "caller")) { + if (state.option.noarg) + warning("W059", left, m); + else if (state.isStrict()) + error("E008"); + } else if (!state.option.evil && left && left.value === "document" && + (m === "write" || m === "writeln")) { + warning("W060", left); + } + + if (!state.option.evil && (m === "eval" || m === "execScript")) { + if (isGlobalEval(left, state)) { + warning("W061"); + } + } + + return that; + }, 160, true); + + infix("(", function(left, that) { + if (state.option.immed && left && !left.immed && left.id === "function") { + warning("W062"); + } + + var n = 0; + var p = []; + + if (left) { + if (left.type === "(identifier)") { + if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { + if ("Array Number String Boolean Date Object Error Symbol".indexOf(left.value) === -1) { + if (left.value === "Math") { + warning("W063", left); + } else if (state.option.newcap) { + warning("W064", left); + } + } + } + } + } + + if (state.tokens.next.id !== ")") { + for (;;) { + p[p.length] = expression(10); + n += 1; + if (state.tokens.next.id !== ",") { + break; + } + comma(); + } + } + + advance(")"); + + if (typeof left === "object") { + if (!state.inES5() && left.value === "parseInt" && n === 1) { + warning("W065", state.tokens.curr); + } + if (!state.option.evil) { + if (left.value === "eval" || left.value === "Function" || + left.value === "execScript") { + warning("W061", left); + + if (p[0] && [0].id === "(string)") { + addInternalSrc(left, p[0].value); + } + } else if (p[0] && p[0].id === "(string)" && + (left.value === "setTimeout" || + left.value === "setInterval")) { + warning("W066", left); + addInternalSrc(left, p[0].value); + } else if (p[0] && p[0].id === "(string)" && + left.value === "." && + left.left.value === "window" && + (left.right === "setTimeout" || + left.right === "setInterval")) { + warning("W066", left); + addInternalSrc(left, p[0].value); + } + } + if (!left.identifier && left.id !== "." && left.id !== "[" && left.id !== "=>" && + left.id !== "(" && left.id !== "&&" && left.id !== "||" && left.id !== "?" && + !(state.inES6() && left["(name)"])) { + warning("W067", that); + } + } + + that.left = left; + return that; + }, 155, true).exps = true; + + prefix("(", function() { + var pn = state.tokens.next, pn1, i = -1; + var ret, triggerFnExpr, first, last; + var parens = 1; + var opening = state.tokens.curr; + var preceeding = state.tokens.prev; + var isNecessary = !state.option.singleGroups; + + do { + if (pn.value === "(") { + parens += 1; + } else if (pn.value === ")") { + parens -= 1; + } + + i += 1; + pn1 = pn; + pn = peek(i); + } while (!(parens === 0 && pn1.value === ")") && pn.value !== ";" && pn.type !== "(end)"); + + if (state.tokens.next.id === "function") { + triggerFnExpr = state.tokens.next.immed = true; + } + if (pn.value === "=>") { + return doFunction({ type: "arrow", parsedOpening: true }); + } + + var exprs = []; + + if (state.tokens.next.id !== ")") { + for (;;) { + exprs.push(expression(10)); + + if (state.tokens.next.id !== ",") { + break; + } + + if (state.option.nocomma) { + warning("W127"); + } + + comma(); + } + } + + advance(")", this); + if (state.option.immed && exprs[0] && exprs[0].id === "function") { + if (state.tokens.next.id !== "(" && + state.tokens.next.id !== "." && state.tokens.next.id !== "[") { + warning("W068", this); + } + } + + if (!exprs.length) { + return; + } + if (exprs.length > 1) { + ret = Object.create(state.syntax[","]); + ret.exprs = exprs; + + first = exprs[0]; + last = exprs[exprs.length - 1]; + + if (!isNecessary) { + isNecessary = preceeding.assign || preceeding.delim; + } + } else { + ret = first = last = exprs[0]; + + if (!isNecessary) { + isNecessary = + (opening.beginsStmt && (ret.id === "{" || triggerFnExpr || isFunctor(ret))) || + (triggerFnExpr && + (!isEndOfExpr() || state.tokens.prev.id !== "}")) || + (isFunctor(ret) && !isEndOfExpr()) || + (ret.id === "{" && preceeding.id === "=>") || + (ret.type === "(number)" && + checkPunctuator(pn, ".") && /^\d+$/.test(ret.value)); + } + } + + if (ret) { + if (!isNecessary && (first.left || first.right || ret.exprs)) { + isNecessary = + (!isBeginOfExpr(preceeding) && first.lbp <= preceeding.lbp) || + (!isEndOfExpr() && last.lbp < state.tokens.next.lbp); + } + + if (!isNecessary) { + warning("W126", opening); + } + + ret.paren = true; + } + + return ret; + }); + + application("=>"); + + infix("[", function(left, that) { + var e = expression(10), s; + if (e && e.type === "(string)") { + if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) { + if (isGlobalEval(left, state)) { + warning("W061"); + } + } + + countMember(e.value); + if (!state.option.sub && reg.identifier.test(e.value)) { + s = state.syntax[e.value]; + if (!s || !isReserved(s)) { + warning("W069", state.tokens.prev, e.value); + } + } + } + advance("]", that); + + if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") { + warning("W001"); + } + + that.left = left; + that.right = e; + return that; + }, 160, true); + + function comprehensiveArrayExpression() { + var res = {}; + res.exps = true; + state.funct["(comparray)"].stack(); + var reversed = false; + if (state.tokens.next.value !== "for") { + reversed = true; + if (!state.inMoz()) { + warning("W116", state.tokens.next, "for", state.tokens.next.value); + } + state.funct["(comparray)"].setState("use"); + res.right = expression(10); + } + + advance("for"); + if (state.tokens.next.value === "each") { + advance("each"); + if (!state.inMoz()) { + warning("W118", state.tokens.curr, "for each"); + } + } + advance("("); + state.funct["(comparray)"].setState("define"); + res.left = expression(130); + if (_.contains(["in", "of"], state.tokens.next.value)) { + advance(); + } else { + error("E045", state.tokens.curr); + } + state.funct["(comparray)"].setState("generate"); + expression(10); + + advance(")"); + if (state.tokens.next.value === "if") { + advance("if"); + advance("("); + state.funct["(comparray)"].setState("filter"); + res.filter = expression(10); + advance(")"); + } + + if (!reversed) { + state.funct["(comparray)"].setState("use"); + res.right = expression(10); + } + + advance("]"); + state.funct["(comparray)"].unstack(); + return res; + } + + prefix("[", function() { + var blocktype = lookupBlockType(); + if (blocktype.isCompArray) { + if (!state.option.esnext && !state.inMoz()) { + warning("W118", state.tokens.curr, "array comprehension"); + } + return comprehensiveArrayExpression(); + } else if (blocktype.isDestAssign) { + this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true }); + return this; + } + var b = state.tokens.curr.line !== startLine(state.tokens.next); + this.first = []; + if (b) { + indent += state.option.indent; + if (state.tokens.next.from === indent + state.option.indent) { + indent += state.option.indent; + } + } + while (state.tokens.next.id !== "(end)") { + while (state.tokens.next.id === ",") { + if (!state.option.elision) { + if (!state.inES5()) { + warning("W070"); + } else { + warning("W128"); + do { + advance(","); + } while (state.tokens.next.id === ","); + continue; + } + } + advance(","); + } + + if (state.tokens.next.id === "]") { + break; + } + + this.first.push(expression(10)); + if (state.tokens.next.id === ",") { + comma({ allowTrailing: true }); + if (state.tokens.next.id === "]" && !state.inES5()) { + warning("W070", state.tokens.curr); + break; + } + } else { + break; + } + } + if (b) { + indent -= state.option.indent; + } + advance("]", this); + return this; + }); + + + function isMethod() { + return state.funct["(statement)"] && state.funct["(statement)"].type === "class" || + state.funct["(context)"] && state.funct["(context)"]["(verb)"] === "class"; + } + + + function isPropertyName(token) { + return token.identifier || token.id === "(string)" || token.id === "(number)"; + } + + + function propertyName(preserveOrToken) { + var id; + var preserve = true; + if (typeof preserveOrToken === "object") { + id = preserveOrToken; + } else { + preserve = preserveOrToken; + id = optionalidentifier(false, true, preserve); + } + + if (!id) { + if (state.tokens.next.id === "(string)") { + id = state.tokens.next.value; + if (!preserve) { + advance(); + } + } else if (state.tokens.next.id === "(number)") { + id = state.tokens.next.value.toString(); + if (!preserve) { + advance(); + } + } + } else if (typeof id === "object") { + if (id.id === "(string)" || id.id === "(identifier)") id = id.value; + else if (id.id === "(number)") id = id.value.toString(); + } + + if (id === "hasOwnProperty") { + warning("W001"); + } + + return id; + } + function functionparams(options) { + var next; + var paramsIds = []; + var ident; + var tokens = []; + var t; + var pastDefault = false; + var pastRest = false; + var arity = 0; + var loneArg = options && options.loneArg; + + if (loneArg && loneArg.identifier === true) { + state.funct["(scope)"].addParam(loneArg.value, loneArg); + return { arity: 1, params: [ loneArg.value ] }; + } + + next = state.tokens.next; + + if (!options || !options.parsedOpening) { + advance("("); + } + + if (state.tokens.next.id === ")") { + advance(")"); + return; + } + + function addParam(addParamArgs) { + state.funct["(scope)"].addParam.apply(state.funct["(scope)"], addParamArgs); + } + + for (;;) { + arity++; + var currentParams = []; + + if (_.contains(["{", "["], state.tokens.next.id)) { + tokens = destructuringPattern(); + for (t in tokens) { + t = tokens[t]; + if (t.id) { + paramsIds.push(t.id); + currentParams.push([t.id, t.token]); + } + } + } else { + if (checkPunctuator(state.tokens.next, "...")) pastRest = true; + ident = identifier(true); + if (ident) { + paramsIds.push(ident); + currentParams.push([ident, state.tokens.curr]); + } else { + while (!checkPunctuators(state.tokens.next, [",", ")"])) advance(); + } + } + if (pastDefault) { + if (state.tokens.next.id !== "=") { + error("W138", state.tokens.current); + } + } + if (state.tokens.next.id === "=") { + if (!state.inES6()) { + warning("W119", state.tokens.next, "default parameters", "6"); + } + advance("="); + pastDefault = true; + expression(10); + } + currentParams.forEach(addParam); + + if (state.tokens.next.id === ",") { + if (pastRest) { + warning("W131", state.tokens.next); + } + comma(); + } else { + advance(")", next); + return { arity: arity, params: paramsIds }; + } + } + } + + function functor(name, token, overwrites) { + var funct = { + "(name)" : name, + "(breakage)" : 0, + "(loopage)" : 0, + "(tokens)" : {}, + "(properties)": {}, + + "(catch)" : false, + "(global)" : false, + + "(line)" : null, + "(character)" : null, + "(metrics)" : null, + "(statement)" : null, + "(context)" : null, + "(scope)" : null, + "(comparray)" : null, + "(generator)" : null, + "(arrow)" : null, + "(params)" : null + }; + + if (token) { + _.extend(funct, { + "(line)" : token.line, + "(character)": token.character, + "(metrics)" : createMetrics(token) + }); + } + + _.extend(funct, overwrites); + + if (funct["(context)"]) { + funct["(scope)"] = funct["(context)"]["(scope)"]; + funct["(comparray)"] = funct["(context)"]["(comparray)"]; + } + + return funct; + } + + function isFunctor(token) { + return "(scope)" in token; + } + function hasParsedCode(funct) { + return funct["(global)"] && !funct["(verb)"]; + } + + function doTemplateLiteral(left) { + var ctx = this.context; + var noSubst = this.noSubst; + var depth = this.depth; + + if (!noSubst) { + while (!end()) { + if (!state.tokens.next.template || state.tokens.next.depth > depth) { + expression(0); // should probably have different rbp? + } else { + advance(); + } + } + } + + return { + id: "(template)", + type: "(template)", + tag: left + }; + + function end() { + if (state.tokens.curr.template && state.tokens.curr.tail && + state.tokens.curr.context === ctx) return true; + var complete = (state.tokens.next.template && state.tokens.next.tail && + state.tokens.next.context === ctx); + if (complete) advance(); + return complete || state.tokens.next.isUnclosed; + } + } + function doFunction(options) { + var f, token, name, statement, classExprBinding, isGenerator, isArrow, ignoreLoopFunc; + var oldOption = state.option; + var oldIgnored = state.ignored; + + if (options) { + name = options.name; + statement = options.statement; + classExprBinding = options.classExprBinding; + isGenerator = options.type === "generator"; + isArrow = options.type === "arrow"; + ignoreLoopFunc = options.ignoreLoopFunc; + } + + state.option = Object.create(state.option); + state.ignored = Object.create(state.ignored); + + state.funct = functor(name || state.nameStack.infer(), state.tokens.next, { + "(statement)": statement, + "(context)": state.funct, + "(arrow)": isArrow, + "(generator)": isGenerator + }); + + f = state.funct; + token = state.tokens.curr; + token.funct = state.funct; + + functions.push(state.funct); + state.funct["(scope)"].stack("functionouter"); + var internallyAccessibleName = name || classExprBinding; + if (internallyAccessibleName) { + state.funct["(scope)"].block.add(internallyAccessibleName, + classExprBinding ? "class" : "function", state.tokens.curr, false); + } + state.funct["(scope)"].stack("functionparams"); + + var paramsInfo = functionparams(options); + + if (paramsInfo) { + state.funct["(params)"] = paramsInfo.params; + state.funct["(metrics)"].arity = paramsInfo.arity; + state.funct["(metrics)"].verifyMaxParametersPerFunction(); + } else { + state.funct["(metrics)"].arity = 0; + } + + if (isArrow) { + if (!state.inES6(true)) { + warning("W119", state.tokens.curr, "arrow function syntax (=>)", "6"); + } + + if (!options.loneArg) { + advance("=>"); + } + } + + block(false, true, true, isArrow); + + if (!state.option.noyield && isGenerator && + state.funct["(generator)"] !== "yielded") { + warning("W124", state.tokens.curr); + } + + state.funct["(metrics)"].verifyMaxStatementsPerFunction(); + state.funct["(metrics)"].verifyMaxComplexityPerFunction(); + state.funct["(unusedOption)"] = state.option.unused; + state.option = oldOption; + state.ignored = oldIgnored; + state.funct["(last)"] = state.tokens.curr.line; + state.funct["(lastcharacter)"] = state.tokens.curr.character; + state.funct["(scope)"].unstack(); // also does usage and label checks + state.funct["(scope)"].unstack(); + + state.funct = state.funct["(context)"]; + + if (!ignoreLoopFunc && !state.option.loopfunc && state.funct["(loopage)"]) { + if (f["(isCapturing)"]) { + warning("W083", token); + } + } + + return f; + } + + function createMetrics(functionStartToken) { + return { + statementCount: 0, + nestedBlockDepth: -1, + ComplexityCount: 1, + arity: 0, + + verifyMaxStatementsPerFunction: function() { + if (state.option.maxstatements && + this.statementCount > state.option.maxstatements) { + warning("W071", functionStartToken, this.statementCount); + } + }, + + verifyMaxParametersPerFunction: function() { + if (_.isNumber(state.option.maxparams) && + this.arity > state.option.maxparams) { + warning("W072", functionStartToken, this.arity); + } + }, + + verifyMaxNestedBlockDepthPerFunction: function() { + if (state.option.maxdepth && + this.nestedBlockDepth > 0 && + this.nestedBlockDepth === state.option.maxdepth + 1) { + warning("W073", null, this.nestedBlockDepth); + } + }, + + verifyMaxComplexityPerFunction: function() { + var max = state.option.maxcomplexity; + var cc = this.ComplexityCount; + if (max && cc > max) { + warning("W074", functionStartToken, cc); + } + } + }; + } + + function increaseComplexityCount() { + state.funct["(metrics)"].ComplexityCount += 1; + } + + function checkCondAssignment(expr) { + var id, paren; + if (expr) { + id = expr.id; + paren = expr.paren; + if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) { + id = expr.id; + paren = paren || expr.paren; + } + } + switch (id) { + case "=": + case "+=": + case "-=": + case "*=": + case "%=": + case "&=": + case "|=": + case "^=": + case "/=": + if (!paren && !state.option.boss) { + warning("W084"); + } + } + } + function checkProperties(props) { + if (state.inES5()) { + for (var name in props) { + if (props[name] && props[name].setterToken && !props[name].getterToken) { + warning("W078", props[name].setterToken); + } + } + } + } + + function metaProperty(name, c) { + if (checkPunctuator(state.tokens.next, ".")) { + var left = state.tokens.curr.id; + advance("."); + var id = identifier(); + state.tokens.curr.isMetaProperty = true; + if (name !== id) { + error("E057", state.tokens.prev, left, id); + } else { + c(); + } + return state.tokens.curr; + } + } + + (function(x) { + x.nud = function() { + var b, f, i, p, t, isGeneratorMethod = false, nextVal; + var props = Object.create(null); // All properties, including accessors + + b = state.tokens.curr.line !== startLine(state.tokens.next); + if (b) { + indent += state.option.indent; + if (state.tokens.next.from === indent + state.option.indent) { + indent += state.option.indent; + } + } + + var blocktype = lookupBlockType(); + if (blocktype.isDestAssign) { + this.destructAssign = destructuringPattern({ openingParsed: true, assignment: true }); + return this; + } + + for (;;) { + if (state.tokens.next.id === "}") { + break; + } + + nextVal = state.tokens.next.value; + if (state.tokens.next.identifier && + (peekIgnoreEOL().id === "," || peekIgnoreEOL().id === "}")) { + if (!state.inES6()) { + warning("W104", state.tokens.next, "object short notation", "6"); + } + i = propertyName(true); + saveProperty(props, i, state.tokens.next); + + expression(10); + + } else if (peek().id !== ":" && (nextVal === "get" || nextVal === "set")) { + advance(nextVal); + + if (!state.inES5()) { + error("E034"); + } + + i = propertyName(); + if (!i && !state.inES6()) { + error("E035"); + } + if (i) { + saveAccessor(nextVal, props, i, state.tokens.curr); + } + + t = state.tokens.next; + f = doFunction(); + p = f["(params)"]; + if (nextVal === "get" && i && p) { + warning("W076", t, p[0], i); + } else if (nextVal === "set" && i && (!p || p.length !== 1)) { + warning("W077", t, i); + } + } else { + if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") { + if (!state.inES6()) { + warning("W104", state.tokens.next, "generator functions", "6"); + } + advance("*"); + isGeneratorMethod = true; + } else { + isGeneratorMethod = false; + } + + if (state.tokens.next.id === "[") { + i = computedPropertyName(); + state.nameStack.set(i); + } else { + state.nameStack.set(state.tokens.next); + i = propertyName(); + saveProperty(props, i, state.tokens.next); + + if (typeof i !== "string") { + break; + } + } + + if (state.tokens.next.value === "(") { + if (!state.inES6()) { + warning("W104", state.tokens.curr, "concise methods", "6"); + } + doFunction({ type: isGeneratorMethod ? "generator" : null }); + } else { + advance(":"); + expression(10); + } + } + + countMember(i); + + if (state.tokens.next.id === ",") { + comma({ allowTrailing: true, property: true }); + if (state.tokens.next.id === ",") { + warning("W070", state.tokens.curr); + } else if (state.tokens.next.id === "}" && !state.inES5()) { + warning("W070", state.tokens.curr); + } + } else { + break; + } + } + if (b) { + indent -= state.option.indent; + } + advance("}", this); + + checkProperties(props); + + return this; + }; + x.fud = function() { + error("E036", state.tokens.curr); + }; + }(delim("{"))); + + function destructuringPattern(options) { + var isAssignment = options && options.assignment; + + if (!state.inES6()) { + warning("W104", state.tokens.curr, + isAssignment ? "destructuring assignment" : "destructuring binding", "6"); + } + + return destructuringPatternRecursive(options); + } + + function destructuringPatternRecursive(options) { + var ids; + var identifiers = []; + var openingParsed = options && options.openingParsed; + var isAssignment = options && options.assignment; + var recursiveOptions = isAssignment ? { assignment: isAssignment } : null; + var firstToken = openingParsed ? state.tokens.curr : state.tokens.next; + + var nextInnerDE = function() { + var ident; + if (checkPunctuators(state.tokens.next, ["[", "{"])) { + ids = destructuringPatternRecursive(recursiveOptions); + for (var id in ids) { + id = ids[id]; + identifiers.push({ id: id.id, token: id.token }); + } + } else if (checkPunctuator(state.tokens.next, ",")) { + identifiers.push({ id: null, token: state.tokens.curr }); + } else if (checkPunctuator(state.tokens.next, "(")) { + advance("("); + nextInnerDE(); + advance(")"); + } else { + var is_rest = checkPunctuator(state.tokens.next, "..."); + + if (isAssignment) { + var identifierToken = is_rest ? peek(0) : state.tokens.next; + if (!identifierToken.identifier) { + warning("E030", identifierToken, identifierToken.value); + } + var assignTarget = expression(155); + if (assignTarget) { + checkLeftSideAssign(assignTarget); + if (assignTarget.identifier) { + ident = assignTarget.value; + } + } + } else { + ident = identifier(); + } + if (ident) { + identifiers.push({ id: ident, token: state.tokens.curr }); + } + return is_rest; + } + return false; + }; + var assignmentProperty = function() { + var id; + if (checkPunctuator(state.tokens.next, "[")) { + advance("["); + expression(10); + advance("]"); + advance(":"); + nextInnerDE(); + } else if (state.tokens.next.id === "(string)" || + state.tokens.next.id === "(number)") { + advance(); + advance(":"); + nextInnerDE(); + } else { + id = identifier(); + if (checkPunctuator(state.tokens.next, ":")) { + advance(":"); + nextInnerDE(); + } else if (id) { + if (isAssignment) { + checkLeftSideAssign(state.tokens.curr); + } + identifiers.push({ id: id, token: state.tokens.curr }); + } + } + }; + if (checkPunctuator(firstToken, "[")) { + if (!openingParsed) { + advance("["); + } + if (checkPunctuator(state.tokens.next, "]")) { + warning("W137", state.tokens.curr); + } + var element_after_rest = false; + while (!checkPunctuator(state.tokens.next, "]")) { + if (nextInnerDE() && !element_after_rest && + checkPunctuator(state.tokens.next, ",")) { + warning("W130", state.tokens.next); + element_after_rest = true; + } + if (checkPunctuator(state.tokens.next, "=")) { + if (checkPunctuator(state.tokens.prev, "...")) { + advance("]"); + } else { + advance("="); + } + if (state.tokens.next.id === "undefined") { + warning("W080", state.tokens.prev, state.tokens.prev.value); + } + expression(10); + } + if (!checkPunctuator(state.tokens.next, "]")) { + advance(","); + } + } + advance("]"); + } else if (checkPunctuator(firstToken, "{")) { + + if (!openingParsed) { + advance("{"); + } + if (checkPunctuator(state.tokens.next, "}")) { + warning("W137", state.tokens.curr); + } + while (!checkPunctuator(state.tokens.next, "}")) { + assignmentProperty(); + if (checkPunctuator(state.tokens.next, "=")) { + advance("="); + if (state.tokens.next.id === "undefined") { + warning("W080", state.tokens.prev, state.tokens.prev.value); + } + expression(10); + } + if (!checkPunctuator(state.tokens.next, "}")) { + advance(","); + if (checkPunctuator(state.tokens.next, "}")) { + break; + } + } + } + advance("}"); + } + return identifiers; + } + + function destructuringPatternMatch(tokens, value) { + var first = value.first; + + if (!first) + return; + + _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function(val) { + var token = val[0]; + var value = val[1]; + + if (token && value) + token.first = value; + else if (token && token.first && !value) + warning("W080", token.first, token.first.value); + }); + } + + function blockVariableStatement(type, statement, context) { + + var prefix = context && context.prefix; + var inexport = context && context.inexport; + var isLet = type === "let"; + var isConst = type === "const"; + var tokens, lone, value, letblock; + + if (!state.inES6()) { + warning("W104", state.tokens.curr, type, "6"); + } + + if (isLet && state.tokens.next.value === "(") { + if (!state.inMoz()) { + warning("W118", state.tokens.next, "let block"); + } + advance("("); + state.funct["(scope)"].stack(); + letblock = true; + } else if (state.funct["(noblockscopedvar)"]) { + error("E048", state.tokens.curr, isConst ? "Const" : "Let"); + } + + statement.first = []; + for (;;) { + var names = []; + if (_.contains(["{", "["], state.tokens.next.value)) { + tokens = destructuringPattern(); + lone = false; + } else { + tokens = [ { id: identifier(), token: state.tokens.curr } ]; + lone = true; + } + + if (!prefix && isConst && state.tokens.next.id !== "=") { + warning("E012", state.tokens.curr, state.tokens.curr.value); + } + + for (var t in tokens) { + if (tokens.hasOwnProperty(t)) { + t = tokens[t]; + if (state.funct["(scope)"].block.isGlobal()) { + if (predefined[t.id] === false) { + warning("W079", t.token, t.id); + } + } + if (t.id && !state.funct["(noblockscopedvar)"]) { + state.funct["(scope)"].addlabel(t.id, { + type: type, + token: t.token }); + names.push(t.token); + + if (lone && inexport) { + state.funct["(scope)"].setExported(t.token.value, t.token); + } + } + } + } + + if (state.tokens.next.id === "=") { + advance("="); + if (!prefix && state.tokens.next.id === "undefined") { + warning("W080", state.tokens.prev, state.tokens.prev.value); + } + if (!prefix && peek(0).id === "=" && state.tokens.next.identifier) { + warning("W120", state.tokens.next, state.tokens.next.value); + } + value = expression(prefix ? 120 : 10); + if (lone) { + tokens[0].first = value; + } else { + destructuringPatternMatch(names, value); + } + } + + statement.first = statement.first.concat(names); + + if (state.tokens.next.id !== ",") { + break; + } + comma(); + } + if (letblock) { + advance(")"); + block(true, true); + statement.block = true; + state.funct["(scope)"].unstack(); + } + + return statement; + } + + var conststatement = stmt("const", function(context) { + return blockVariableStatement("const", this, context); + }); + conststatement.exps = true; + + var letstatement = stmt("let", function(context) { + return blockVariableStatement("let", this, context); + }); + letstatement.exps = true; + + var varstatement = stmt("var", function(context) { + var prefix = context && context.prefix; + var inexport = context && context.inexport; + var tokens, lone, value; + var implied = context && context.implied; + var report = !(context && context.ignore); + + this.first = []; + for (;;) { + var names = []; + if (_.contains(["{", "["], state.tokens.next.value)) { + tokens = destructuringPattern(); + lone = false; + } else { + tokens = [ { id: identifier(), token: state.tokens.curr } ]; + lone = true; + } + + if (!(prefix && implied) && report && state.option.varstmt) { + warning("W132", this); + } + + this.first = this.first.concat(names); + + for (var t in tokens) { + if (tokens.hasOwnProperty(t)) { + t = tokens[t]; + if (!implied && state.funct["(global)"]) { + if (predefined[t.id] === false) { + warning("W079", t.token, t.id); + } else if (state.option.futurehostile === false) { + if ((!state.inES5() && vars.ecmaIdentifiers[5][t.id] === false) || + (!state.inES6() && vars.ecmaIdentifiers[6][t.id] === false)) { + warning("W129", t.token, t.id); + } + } + } + if (t.id) { + if (implied === "for") { + + if (!state.funct["(scope)"].has(t.id)) { + if (report) warning("W088", t.token, t.id); + } + state.funct["(scope)"].block.use(t.id, t.token); + } else { + state.funct["(scope)"].addlabel(t.id, { + type: "var", + token: t.token }); + + if (lone && inexport) { + state.funct["(scope)"].setExported(t.id, t.token); + } + } + names.push(t.token); + } + } + } + + if (state.tokens.next.id === "=") { + state.nameStack.set(state.tokens.curr); + + advance("="); + if (!prefix && report && !state.funct["(loopage)"] && + state.tokens.next.id === "undefined") { + warning("W080", state.tokens.prev, state.tokens.prev.value); + } + if (peek(0).id === "=" && state.tokens.next.identifier) { + if (!prefix && report && + !state.funct["(params)"] || + state.funct["(params)"].indexOf(state.tokens.next.value) === -1) { + warning("W120", state.tokens.next, state.tokens.next.value); + } + } + value = expression(prefix ? 120 : 10); + if (lone) { + tokens[0].first = value; + } else { + destructuringPatternMatch(names, value); + } + } + + if (state.tokens.next.id !== ",") { + break; + } + comma(); + } + + return this; + }); + varstatement.exps = true; + + blockstmt("class", function() { + return classdef.call(this, true); + }); + + function classdef(isStatement) { + if (!state.inES6()) { + warning("W104", state.tokens.curr, "class", "6"); + } + if (isStatement) { + this.name = identifier(); + + state.funct["(scope)"].addlabel(this.name, { + type: "class", + token: state.tokens.curr }); + } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") { + this.name = identifier(); + this.namedExpr = true; + } else { + this.name = state.nameStack.infer(); + } + classtail(this); + return this; + } + + function classtail(c) { + var wasInClassBody = state.inClassBody; + if (state.tokens.next.value === "extends") { + advance("extends"); + c.heritage = expression(10); + } + + state.inClassBody = true; + advance("{"); + c.body = classbody(c); + advance("}"); + state.inClassBody = wasInClassBody; + } + + function classbody(c) { + var name; + var isStatic; + var isGenerator; + var getset; + var props = Object.create(null); + var staticProps = Object.create(null); + var computed; + for (var i = 0; state.tokens.next.id !== "}"; ++i) { + name = state.tokens.next; + isStatic = false; + isGenerator = false; + getset = null; + if (name.id === ";") { + warning("W032"); + advance(";"); + continue; + } + + if (name.id === "*") { + isGenerator = true; + advance("*"); + name = state.tokens.next; + } + if (name.id === "[") { + name = computedPropertyName(); + computed = true; + } else if (isPropertyName(name)) { + advance(); + computed = false; + if (name.identifier && name.value === "static") { + if (checkPunctuator(state.tokens.next, "*")) { + isGenerator = true; + advance("*"); + } + if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") { + computed = state.tokens.next.id === "["; + isStatic = true; + name = state.tokens.next; + if (state.tokens.next.id === "[") { + name = computedPropertyName(); + } else advance(); + } + } + + if (name.identifier && (name.value === "get" || name.value === "set")) { + if (isPropertyName(state.tokens.next) || state.tokens.next.id === "[") { + computed = state.tokens.next.id === "["; + getset = name; + name = state.tokens.next; + if (state.tokens.next.id === "[") { + name = computedPropertyName(); + } else advance(); + } + } + } else { + warning("W052", state.tokens.next, state.tokens.next.value || state.tokens.next.type); + advance(); + continue; + } + + if (!checkPunctuator(state.tokens.next, "(")) { + error("E054", state.tokens.next, state.tokens.next.value); + while (state.tokens.next.id !== "}" && + !checkPunctuator(state.tokens.next, "(")) { + advance(); + } + if (state.tokens.next.value !== "(") { + doFunction({ statement: c }); + } + } + + if (!computed) { + if (getset) { + saveAccessor( + getset.value, isStatic ? staticProps : props, name.value, name, true, isStatic); + } else { + if (name.value === "constructor") { + state.nameStack.set(c); + } else { + state.nameStack.set(name); + } + saveProperty(isStatic ? staticProps : props, name.value, name, true, isStatic); + } + } + + if (getset && name.value === "constructor") { + var propDesc = getset.value === "get" ? "class getter method" : "class setter method"; + error("E049", name, propDesc, "constructor"); + } else if (name.value === "prototype") { + error("E049", name, "class method", "prototype"); + } + + propertyName(name); + + doFunction({ + statement: c, + type: isGenerator ? "generator" : null, + classExprBinding: c.namedExpr ? c.name : null + }); + } + + checkProperties(props); + } + + blockstmt("function", function(context) { + var inexport = context && context.inexport; + var generator = false; + if (state.tokens.next.value === "*") { + advance("*"); + if (state.inES6({ strict: true })) { + generator = true; + } else { + warning("W119", state.tokens.curr, "function*", "6"); + } + } + if (inblock) { + warning("W082", state.tokens.curr); + } + var i = optionalidentifier(); + + state.funct["(scope)"].addlabel(i, { + type: "function", + token: state.tokens.curr }); + + if (i === undefined) { + warning("W025"); + } else if (inexport) { + state.funct["(scope)"].setExported(i, state.tokens.prev); + } + + doFunction({ + name: i, + statement: this, + type: generator ? "generator" : null, + ignoreLoopFunc: inblock // a declaration may already have warned + }); + if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { + error("E039"); + } + return this; + }); + + prefix("function", function() { + var generator = false; + + if (state.tokens.next.value === "*") { + if (!state.inES6()) { + warning("W119", state.tokens.curr, "function*", "6"); + } + advance("*"); + generator = true; + } + + var i = optionalidentifier(); + doFunction({ name: i, type: generator ? "generator" : null }); + return this; + }); + + blockstmt("if", function() { + var t = state.tokens.next; + increaseComplexityCount(); + state.condition = true; + advance("("); + var expr = expression(0); + checkCondAssignment(expr); + var forinifcheck = null; + if (state.option.forin && state.forinifcheckneeded) { + state.forinifcheckneeded = false; // We only need to analyze the first if inside the loop + forinifcheck = state.forinifchecks[state.forinifchecks.length - 1]; + if (expr.type === "(punctuator)" && expr.value === "!") { + forinifcheck.type = "(negative)"; + } else { + forinifcheck.type = "(positive)"; + } + } + + advance(")", t); + state.condition = false; + var s = block(true, true); + if (forinifcheck && forinifcheck.type === "(negative)") { + if (s && s[0] && s[0].type === "(identifier)" && s[0].value === "continue") { + forinifcheck.type = "(negative-with-continue)"; + } + } + + if (state.tokens.next.id === "else") { + advance("else"); + if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") { + statement(); + } else { + block(true, true); + } + } + return this; + }); + + blockstmt("try", function() { + var b; + + function doCatch() { + advance("catch"); + advance("("); + + state.funct["(scope)"].stack("catchparams"); + + if (checkPunctuators(state.tokens.next, ["[", "{"])) { + var tokens = destructuringPattern(); + _.each(tokens, function(token) { + if (token.id) { + state.funct["(scope)"].addParam(token.id, token, "exception"); + } + }); + } else if (state.tokens.next.type !== "(identifier)") { + warning("E030", state.tokens.next, state.tokens.next.value); + } else { + state.funct["(scope)"].addParam(identifier(), state.tokens.curr, "exception"); + } + + if (state.tokens.next.value === "if") { + if (!state.inMoz()) { + warning("W118", state.tokens.curr, "catch filter"); + } + advance("if"); + expression(0); + } + + advance(")"); + + block(false); + + state.funct["(scope)"].unstack(); + } + + block(true); + + while (state.tokens.next.id === "catch") { + increaseComplexityCount(); + if (b && (!state.inMoz())) { + warning("W118", state.tokens.next, "multiple catch blocks"); + } + doCatch(); + b = true; + } + + if (state.tokens.next.id === "finally") { + advance("finally"); + block(true); + return; + } + + if (!b) { + error("E021", state.tokens.next, "catch", state.tokens.next.value); + } + + return this; + }); + + blockstmt("while", function() { + var t = state.tokens.next; + state.funct["(breakage)"] += 1; + state.funct["(loopage)"] += 1; + increaseComplexityCount(); + advance("("); + checkCondAssignment(expression(0)); + advance(")", t); + block(true, true); + state.funct["(breakage)"] -= 1; + state.funct["(loopage)"] -= 1; + return this; + }).labelled = true; + + blockstmt("with", function() { + var t = state.tokens.next; + if (state.isStrict()) { + error("E010", state.tokens.curr); + } else if (!state.option.withstmt) { + warning("W085", state.tokens.curr); + } + + advance("("); + expression(0); + advance(")", t); + block(true, true); + + return this; + }); + + blockstmt("switch", function() { + var t = state.tokens.next; + var g = false; + var noindent = false; + + state.funct["(breakage)"] += 1; + advance("("); + checkCondAssignment(expression(0)); + advance(")", t); + t = state.tokens.next; + advance("{"); + + if (state.tokens.next.from === indent) + noindent = true; + + if (!noindent) + indent += state.option.indent; + + this.cases = []; + + for (;;) { + switch (state.tokens.next.id) { + case "case": + switch (state.funct["(verb)"]) { + case "yield": + case "break": + case "case": + case "continue": + case "return": + case "switch": + case "throw": + break; + default: + if (!state.tokens.curr.caseFallsThrough) { + warning("W086", state.tokens.curr, "case"); + } + } + + advance("case"); + this.cases.push(expression(0)); + increaseComplexityCount(); + g = true; + advance(":"); + state.funct["(verb)"] = "case"; + break; + case "default": + switch (state.funct["(verb)"]) { + case "yield": + case "break": + case "continue": + case "return": + case "throw": + break; + default: + if (this.cases.length) { + if (!state.tokens.curr.caseFallsThrough) { + warning("W086", state.tokens.curr, "default"); + } + } + } + + advance("default"); + g = true; + advance(":"); + break; + case "}": + if (!noindent) + indent -= state.option.indent; + + advance("}", t); + state.funct["(breakage)"] -= 1; + state.funct["(verb)"] = undefined; + return; + case "(end)": + error("E023", state.tokens.next, "}"); + return; + default: + indent += state.option.indent; + if (g) { + switch (state.tokens.curr.id) { + case ",": + error("E040"); + return; + case ":": + g = false; + statements(); + break; + default: + error("E025", state.tokens.curr); + return; + } + } else { + if (state.tokens.curr.id === ":") { + advance(":"); + error("E024", state.tokens.curr, ":"); + statements(); + } else { + error("E021", state.tokens.next, "case", state.tokens.next.value); + return; + } + } + indent -= state.option.indent; + } + } + return this; + }).labelled = true; + + stmt("debugger", function() { + if (!state.option.debug) { + warning("W087", this); + } + return this; + }).exps = true; + + (function() { + var x = stmt("do", function() { + state.funct["(breakage)"] += 1; + state.funct["(loopage)"] += 1; + increaseComplexityCount(); + + this.first = block(true, true); + advance("while"); + var t = state.tokens.next; + advance("("); + checkCondAssignment(expression(0)); + advance(")", t); + state.funct["(breakage)"] -= 1; + state.funct["(loopage)"] -= 1; + return this; + }); + x.labelled = true; + x.exps = true; + }()); + + blockstmt("for", function() { + var s, t = state.tokens.next; + var letscope = false; + var foreachtok = null; + + if (t.value === "each") { + foreachtok = t; + advance("each"); + if (!state.inMoz()) { + warning("W118", state.tokens.curr, "for each"); + } + } + + increaseComplexityCount(); + advance("("); + var nextop; // contains the token of the "in" or "of" operator + var i = 0; + var inof = ["in", "of"]; + var level = 0; // BindingPattern "level" --- level 0 === no BindingPattern + var comma; // First comma punctuator at level 0 + var initializer; // First initializer at level 0 + if (checkPunctuators(state.tokens.next, ["{", "["])) ++level; + do { + nextop = peek(i); + ++i; + if (checkPunctuators(nextop, ["{", "["])) ++level; + else if (checkPunctuators(nextop, ["}", "]"])) --level; + if (level < 0) break; + if (level === 0) { + if (!comma && checkPunctuator(nextop, ",")) comma = nextop; + else if (!initializer && checkPunctuator(nextop, "=")) initializer = nextop; + } + } while (level > 0 || !_.contains(inof, nextop.value) && nextop.value !== ";" && + nextop.type !== "(end)"); // Is this a JSCS bug? This looks really weird. + if (_.contains(inof, nextop.value)) { + if (!state.inES6() && nextop.value === "of") { + warning("W104", nextop, "for of", "6"); + } + + var ok = !(initializer || comma); + if (initializer) { + error("W133", comma, nextop.value, "initializer is forbidden"); + } + + if (comma) { + error("W133", comma, nextop.value, "more than one ForBinding"); + } + + if (state.tokens.next.id === "var") { + advance("var"); + state.tokens.curr.fud({ prefix: true }); + } else if (state.tokens.next.id === "let" || state.tokens.next.id === "const") { + advance(state.tokens.next.id); + letscope = true; + state.funct["(scope)"].stack(); + state.tokens.curr.fud({ prefix: true }); + } else { + Object.create(varstatement).fud({ prefix: true, implied: "for", ignore: !ok }); + } + advance(nextop.value); + expression(20); + advance(")", t); + + if (nextop.value === "in" && state.option.forin) { + state.forinifcheckneeded = true; + + if (state.forinifchecks === undefined) { + state.forinifchecks = []; + } + state.forinifchecks.push({ + type: "(none)" + }); + } + + state.funct["(breakage)"] += 1; + state.funct["(loopage)"] += 1; + + s = block(true, true); + + if (nextop.value === "in" && state.option.forin) { + if (state.forinifchecks && state.forinifchecks.length > 0) { + var check = state.forinifchecks.pop(); + + if (// No if statement or not the first statement in loop body + s && s.length > 0 && (typeof s[0] !== "object" || s[0].value !== "if") || + check.type === "(positive)" && s.length > 1 || + check.type === "(negative)") { + warning("W089", this); + } + } + state.forinifcheckneeded = false; + } + + state.funct["(breakage)"] -= 1; + state.funct["(loopage)"] -= 1; + } else { + if (foreachtok) { + error("E045", foreachtok); + } + if (state.tokens.next.id !== ";") { + if (state.tokens.next.id === "var") { + advance("var"); + state.tokens.curr.fud(); + } else if (state.tokens.next.id === "let") { + advance("let"); + letscope = true; + state.funct["(scope)"].stack(); + state.tokens.curr.fud(); + } else { + for (;;) { + expression(0, "for"); + if (state.tokens.next.id !== ",") { + break; + } + comma(); + } + } + } + nolinebreak(state.tokens.curr); + advance(";"); + state.funct["(loopage)"] += 1; + if (state.tokens.next.id !== ";") { + checkCondAssignment(expression(0)); + } + nolinebreak(state.tokens.curr); + advance(";"); + if (state.tokens.next.id === ";") { + error("E021", state.tokens.next, ")", ";"); + } + if (state.tokens.next.id !== ")") { + for (;;) { + expression(0, "for"); + if (state.tokens.next.id !== ",") { + break; + } + comma(); + } + } + advance(")", t); + state.funct["(breakage)"] += 1; + block(true, true); + state.funct["(breakage)"] -= 1; + state.funct["(loopage)"] -= 1; + + } + if (letscope) { + state.funct["(scope)"].unstack(); + } + return this; + }).labelled = true; + + + stmt("break", function() { + var v = state.tokens.next.value; + + if (!state.option.asi) + nolinebreak(this); + + if (state.tokens.next.id !== ";" && !state.tokens.next.reach && + state.tokens.curr.line === startLine(state.tokens.next)) { + if (!state.funct["(scope)"].funct.hasBreakLabel(v)) { + warning("W090", state.tokens.next, v); + } + this.first = state.tokens.next; + advance(); + } else { + if (state.funct["(breakage)"] === 0) + warning("W052", state.tokens.next, this.value); + } + + reachable(this); + + return this; + }).exps = true; + + + stmt("continue", function() { + var v = state.tokens.next.value; + + if (state.funct["(breakage)"] === 0) + warning("W052", state.tokens.next, this.value); + if (!state.funct["(loopage)"]) + warning("W052", state.tokens.next, this.value); + + if (!state.option.asi) + nolinebreak(this); + + if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { + if (state.tokens.curr.line === startLine(state.tokens.next)) { + if (!state.funct["(scope)"].funct.hasBreakLabel(v)) { + warning("W090", state.tokens.next, v); + } + this.first = state.tokens.next; + advance(); + } + } + + reachable(this); + + return this; + }).exps = true; + + + stmt("return", function() { + if (this.line === startLine(state.tokens.next)) { + if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { + this.first = expression(0); + + if (this.first && + this.first.type === "(punctuator)" && this.first.value === "=" && + !this.first.paren && !state.option.boss) { + warningAt("W093", this.first.line, this.first.character); + } + } + } else { + if (state.tokens.next.type === "(punctuator)" && + ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) { + nolinebreak(this); // always warn (Line breaking error) + } + } + + reachable(this); + + return this; + }).exps = true; + + (function(x) { + x.exps = true; + x.lbp = 25; + }(prefix("yield", function() { + var prev = state.tokens.prev; + if (state.inES6(true) && !state.funct["(generator)"]) { + if (!("(catch)" === state.funct["(name)"] && state.funct["(context)"]["(generator)"])) { + error("E046", state.tokens.curr, "yield"); + } + } else if (!state.inES6()) { + warning("W104", state.tokens.curr, "yield", "6"); + } + state.funct["(generator)"] = "yielded"; + var delegatingYield = false; + + if (state.tokens.next.value === "*") { + delegatingYield = true; + advance("*"); + } + + if (this.line === startLine(state.tokens.next) || !state.inMoz()) { + if (delegatingYield || + (state.tokens.next.id !== ";" && !state.option.asi && + !state.tokens.next.reach && state.tokens.next.nud)) { + + nobreaknonadjacent(state.tokens.curr, state.tokens.next); + this.first = expression(10); + + if (this.first.type === "(punctuator)" && this.first.value === "=" && + !this.first.paren && !state.option.boss) { + warningAt("W093", this.first.line, this.first.character); + } + } + + if (state.inMoz() && state.tokens.next.id !== ")" && + (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) { + error("E050", this); + } + } else if (!state.option.asi) { + nolinebreak(this); // always warn (Line breaking error) + } + return this; + }))); + + + stmt("throw", function() { + nolinebreak(this); + this.first = expression(20); + + reachable(this); + + return this; + }).exps = true; + + stmt("import", function() { + if (!state.inES6()) { + warning("W119", state.tokens.curr, "import", "6"); + } + + if (state.tokens.next.type === "(string)") { + advance("(string)"); + return this; + } + + if (state.tokens.next.identifier) { + this.name = identifier(); + state.funct["(scope)"].addlabel(this.name, { + type: "const", + token: state.tokens.curr }); + + if (state.tokens.next.value === ",") { + advance(","); + } else { + advance("from"); + advance("(string)"); + return this; + } + } + + if (state.tokens.next.id === "*") { + advance("*"); + advance("as"); + if (state.tokens.next.identifier) { + this.name = identifier(); + state.funct["(scope)"].addlabel(this.name, { + type: "const", + token: state.tokens.curr }); + } + } else { + advance("{"); + for (;;) { + if (state.tokens.next.value === "}") { + advance("}"); + break; + } + var importName; + if (state.tokens.next.type === "default") { + importName = "default"; + advance("default"); + } else { + importName = identifier(); + } + if (state.tokens.next.value === "as") { + advance("as"); + importName = identifier(); + } + state.funct["(scope)"].addlabel(importName, { + type: "const", + token: state.tokens.curr }); + + if (state.tokens.next.value === ",") { + advance(","); + } else if (state.tokens.next.value === "}") { + advance("}"); + break; + } else { + error("E024", state.tokens.next, state.tokens.next.value); + break; + } + } + } + advance("from"); + advance("(string)"); + return this; + }).exps = true; + + stmt("export", function() { + var ok = true; + var token; + var identifier; + + if (!state.inES6()) { + warning("W119", state.tokens.curr, "export", "6"); + ok = false; + } + + if (!state.funct["(scope)"].block.isGlobal()) { + error("E053", state.tokens.curr); + ok = false; + } + + if (state.tokens.next.value === "*") { + advance("*"); + advance("from"); + advance("(string)"); + return this; + } + + if (state.tokens.next.type === "default") { + state.nameStack.set(state.tokens.next); + advance("default"); + var exportType = state.tokens.next.id; + if (exportType === "function" || exportType === "class") { + this.block = true; + } + + token = peek(); + + expression(10); + + identifier = token.value; + + if (this.block) { + state.funct["(scope)"].addlabel(identifier, { + type: exportType, + token: token }); + + state.funct["(scope)"].setExported(identifier, token); + } + + return this; + } + + if (state.tokens.next.value === "{") { + advance("{"); + var exportedTokens = []; + for (;;) { + if (!state.tokens.next.identifier) { + error("E030", state.tokens.next, state.tokens.next.value); + } + advance(); + + exportedTokens.push(state.tokens.curr); + + if (state.tokens.next.value === "as") { + advance("as"); + if (!state.tokens.next.identifier) { + error("E030", state.tokens.next, state.tokens.next.value); + } + advance(); + } + + if (state.tokens.next.value === ",") { + advance(","); + } else if (state.tokens.next.value === "}") { + advance("}"); + break; + } else { + error("E024", state.tokens.next, state.tokens.next.value); + break; + } + } + if (state.tokens.next.value === "from") { + advance("from"); + advance("(string)"); + } else if (ok) { + exportedTokens.forEach(function(token) { + state.funct["(scope)"].setExported(token.value, token); + }); + } + return this; + } + + if (state.tokens.next.id === "var") { + advance("var"); + state.tokens.curr.fud({ inexport:true }); + } else if (state.tokens.next.id === "let") { + advance("let"); + state.tokens.curr.fud({ inexport:true }); + } else if (state.tokens.next.id === "const") { + advance("const"); + state.tokens.curr.fud({ inexport:true }); + } else if (state.tokens.next.id === "function") { + this.block = true; + advance("function"); + state.syntax["function"].fud({ inexport:true }); + } else if (state.tokens.next.id === "class") { + this.block = true; + advance("class"); + var classNameToken = state.tokens.next; + state.syntax["class"].fud(); + state.funct["(scope)"].setExported(classNameToken.value, classNameToken); + } else { + error("E024", state.tokens.next, state.tokens.next.value); + } + + return this; + }).exps = true; + + FutureReservedWord("abstract"); + FutureReservedWord("boolean"); + FutureReservedWord("byte"); + FutureReservedWord("char"); + FutureReservedWord("class", { es5: true, nud: classdef }); + FutureReservedWord("double"); + FutureReservedWord("enum", { es5: true }); + FutureReservedWord("export", { es5: true }); + FutureReservedWord("extends", { es5: true }); + FutureReservedWord("final"); + FutureReservedWord("float"); + FutureReservedWord("goto"); + FutureReservedWord("implements", { es5: true, strictOnly: true }); + FutureReservedWord("import", { es5: true }); + FutureReservedWord("int"); + FutureReservedWord("interface", { es5: true, strictOnly: true }); + FutureReservedWord("long"); + FutureReservedWord("native"); + FutureReservedWord("package", { es5: true, strictOnly: true }); + FutureReservedWord("private", { es5: true, strictOnly: true }); + FutureReservedWord("protected", { es5: true, strictOnly: true }); + FutureReservedWord("public", { es5: true, strictOnly: true }); + FutureReservedWord("short"); + FutureReservedWord("static", { es5: true, strictOnly: true }); + FutureReservedWord("super", { es5: true }); + FutureReservedWord("synchronized"); + FutureReservedWord("transient"); + FutureReservedWord("volatile"); + + var lookupBlockType = function() { + var pn, pn1, prev; + var i = -1; + var bracketStack = 0; + var ret = {}; + if (checkPunctuators(state.tokens.curr, ["[", "{"])) { + bracketStack += 1; + } + do { + prev = i === -1 ? state.tokens.curr : pn; + pn = i === -1 ? state.tokens.next : peek(i); + pn1 = peek(i + 1); + i = i + 1; + if (checkPunctuators(pn, ["[", "{"])) { + bracketStack += 1; + } else if (checkPunctuators(pn, ["]", "}"])) { + bracketStack -= 1; + } + if (bracketStack === 1 && pn.identifier && pn.value === "for" && + !checkPunctuator(prev, ".")) { + ret.isCompArray = true; + ret.notJson = true; + break; + } + if (bracketStack === 0 && checkPunctuators(pn, ["}", "]"])) { + if (pn1.value === "=") { + ret.isDestAssign = true; + ret.notJson = true; + break; + } else if (pn1.value === ".") { + ret.notJson = true; + break; + } + } + if (checkPunctuator(pn, ";")) { + ret.isBlock = true; + ret.notJson = true; + } + } while (bracketStack > 0 && pn.id !== "(end)"); + return ret; + }; + + function saveProperty(props, name, tkn, isClass, isStatic) { + var msg = ["key", "class method", "static class method"]; + msg = msg[(isClass || false) + (isStatic || false)]; + if (tkn.identifier) { + name = tkn.value; + } + + if (props[name] && name !== "__proto__") { + warning("W075", state.tokens.next, msg, name); + } else { + props[name] = Object.create(null); + } + + props[name].basic = true; + props[name].basictkn = tkn; + } + function saveAccessor(accessorType, props, name, tkn, isClass, isStatic) { + var flagName = accessorType === "get" ? "getterToken" : "setterToken"; + var msg = ""; + + if (isClass) { + if (isStatic) { + msg += "static "; + } + msg += accessorType + "ter method"; + } else { + msg = "key"; + } + + state.tokens.curr.accessorType = accessorType; + state.nameStack.set(tkn); + + if (props[name]) { + if ((props[name].basic || props[name][flagName]) && name !== "__proto__") { + warning("W075", state.tokens.next, msg, name); + } + } else { + props[name] = Object.create(null); + } + + props[name][flagName] = tkn; + } + + function computedPropertyName() { + advance("["); + if (!state.inES6()) { + warning("W119", state.tokens.curr, "computed property names", "6"); + } + var value = expression(10); + advance("]"); + return value; + } + function checkPunctuators(token, values) { + if (token.type === "(punctuator)") { + return _.contains(values, token.value); + } + return false; + } + function checkPunctuator(token, value) { + return token.type === "(punctuator)" && token.value === value; + } + function destructuringAssignOrJsonValue() { + + var block = lookupBlockType(); + if (block.notJson) { + if (!state.inES6() && block.isDestAssign) { + warning("W104", state.tokens.curr, "destructuring assignment", "6"); + } + statements(); + } else { + state.option.laxbreak = true; + state.jsonMode = true; + jsonValue(); + } + } + + var arrayComprehension = function() { + var CompArray = function() { + this.mode = "use"; + this.variables = []; + }; + var _carrays = []; + var _current; + function declare(v) { + var l = _current.variables.filter(function(elt) { + if (elt.value === v) { + elt.undef = false; + return v; + } + }).length; + return l !== 0; + } + function use(v) { + var l = _current.variables.filter(function(elt) { + if (elt.value === v && !elt.undef) { + if (elt.unused === true) { + elt.unused = false; + } + return v; + } + }).length; + return (l === 0); + } + return { stack: function() { + _current = new CompArray(); + _carrays.push(_current); + }, + unstack: function() { + _current.variables.filter(function(v) { + if (v.unused) + warning("W098", v.token, v.raw_text || v.value); + if (v.undef) + state.funct["(scope)"].block.use(v.value, v.token); + }); + _carrays.splice(-1, 1); + _current = _carrays[_carrays.length - 1]; + }, + setState: function(s) { + if (_.contains(["use", "define", "generate", "filter"], s)) + _current.mode = s; + }, + check: function(v) { + if (!_current) { + return; + } + if (_current && _current.mode === "use") { + if (use(v)) { + _current.variables.push({ + funct: state.funct, + token: state.tokens.curr, + value: v, + undef: true, + unused: false + }); + } + return true; + } else if (_current && _current.mode === "define") { + if (!declare(v)) { + _current.variables.push({ + funct: state.funct, + token: state.tokens.curr, + value: v, + undef: false, + unused: true + }); + } + return true; + } else if (_current && _current.mode === "generate") { + state.funct["(scope)"].block.use(v, state.tokens.curr); + return true; + } else if (_current && _current.mode === "filter") { + if (use(v)) { + state.funct["(scope)"].block.use(v, state.tokens.curr); + } + return true; + } + return false; + } + }; + }; + + function jsonValue() { + function jsonObject() { + var o = {}, t = state.tokens.next; + advance("{"); + if (state.tokens.next.id !== "}") { + for (;;) { + if (state.tokens.next.id === "(end)") { + error("E026", state.tokens.next, t.line); + } else if (state.tokens.next.id === "}") { + warning("W094", state.tokens.curr); + break; + } else if (state.tokens.next.id === ",") { + error("E028", state.tokens.next); + } else if (state.tokens.next.id !== "(string)") { + warning("W095", state.tokens.next, state.tokens.next.value); + } + if (o[state.tokens.next.value] === true) { + warning("W075", state.tokens.next, "key", state.tokens.next.value); + } else if ((state.tokens.next.value === "__proto__" && + !state.option.proto) || (state.tokens.next.value === "__iterator__" && + !state.option.iterator)) { + warning("W096", state.tokens.next, state.tokens.next.value); + } else { + o[state.tokens.next.value] = true; + } + advance(); + advance(":"); + jsonValue(); + if (state.tokens.next.id !== ",") { + break; + } + advance(","); + } + } + advance("}"); + } + + function jsonArray() { + var t = state.tokens.next; + advance("["); + if (state.tokens.next.id !== "]") { + for (;;) { + if (state.tokens.next.id === "(end)") { + error("E027", state.tokens.next, t.line); + } else if (state.tokens.next.id === "]") { + warning("W094", state.tokens.curr); + break; + } else if (state.tokens.next.id === ",") { + error("E028", state.tokens.next); + } + jsonValue(); + if (state.tokens.next.id !== ",") { + break; + } + advance(","); + } + } + advance("]"); + } + + switch (state.tokens.next.id) { + case "{": + jsonObject(); + break; + case "[": + jsonArray(); + break; + case "true": + case "false": + case "null": + case "(number)": + case "(string)": + advance(); + break; + case "-": + advance("-"); + advance("(number)"); + break; + default: + error("E003", state.tokens.next); + } + } + + var escapeRegex = function(str) { + return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); + }; + var itself = function(s, o, g) { + var i, k, x, reIgnoreStr, reIgnore; + var optionKeys; + var newOptionObj = {}; + var newIgnoredObj = {}; + + o = _.clone(o); + state.reset(); + + if (o && o.scope) { + JSHINT.scope = o.scope; + } else { + JSHINT.errors = []; + JSHINT.undefs = []; + JSHINT.internals = []; + JSHINT.blacklist = {}; + JSHINT.scope = "(main)"; + } + + predefined = Object.create(null); + combine(predefined, vars.ecmaIdentifiers[3]); + combine(predefined, vars.reservedVars); + + combine(predefined, g || {}); + + declared = Object.create(null); + var exported = Object.create(null); // Variables that live outside the current file + + function each(obj, cb) { + if (!obj) + return; + + if (!Array.isArray(obj) && typeof obj === "object") + obj = Object.keys(obj); + + obj.forEach(cb); + } + + if (o) { + each(o.predef || null, function(item) { + var slice, prop; + + if (item[0] === "-") { + slice = item.slice(1); + JSHINT.blacklist[slice] = slice; + delete predefined[slice]; + } else { + prop = Object.getOwnPropertyDescriptor(o.predef, item); + predefined[item] = prop ? prop.value : false; + } + }); + + each(o.exported || null, function(item) { + exported[item] = true; + }); + + delete o.predef; + delete o.exported; + + optionKeys = Object.keys(o); + for (x = 0; x < optionKeys.length; x++) { + if (/^-W\d{3}$/g.test(optionKeys[x])) { + newIgnoredObj[optionKeys[x].slice(1)] = true; + } else { + var optionKey = optionKeys[x]; + newOptionObj[optionKey] = o[optionKey]; + if ((optionKey === "esversion" && o[optionKey] === 5) || + (optionKey === "es5" && o[optionKey])) { + warning("I003"); + } + + if (optionKeys[x] === "newcap" && o[optionKey] === false) + newOptionObj["(explicitNewcap)"] = true; + } + } + } + + state.option = newOptionObj; + state.ignored = newIgnoredObj; + + state.option.indent = state.option.indent || 4; + state.option.maxerr = state.option.maxerr || 50; + + indent = 1; + + var scopeManagerInst = scopeManager(state, predefined, exported, declared); + scopeManagerInst.on("warning", function(ev) { + warning.apply(null, [ ev.code, ev.token].concat(ev.data)); + }); + + scopeManagerInst.on("error", function(ev) { + error.apply(null, [ ev.code, ev.token ].concat(ev.data)); + }); + + state.funct = functor("(global)", null, { + "(global)" : true, + "(scope)" : scopeManagerInst, + "(comparray)" : arrayComprehension(), + "(metrics)" : createMetrics(state.tokens.next) + }); + + functions = [state.funct]; + urls = []; + stack = null; + member = {}; + membersOnly = null; + inblock = false; + lookahead = []; + + if (!isString(s) && !Array.isArray(s)) { + errorAt("E004", 0); + return false; + } + + api = { + get isJSON() { + return state.jsonMode; + }, + + getOption: function(name) { + return state.option[name] || null; + }, + + getCache: function(name) { + return state.cache[name]; + }, + + setCache: function(name, value) { + state.cache[name] = value; + }, + + warn: function(code, data) { + warningAt.apply(null, [ code, data.line, data.char ].concat(data.data)); + }, + + on: function(names, listener) { + names.split(" ").forEach(function(name) { + emitter.on(name, listener); + }.bind(this)); + } + }; + + emitter.removeAllListeners(); + (extraModules || []).forEach(function(func) { + func(api); + }); + + state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"]; + + if (o && o.ignoreDelimiters) { + + if (!Array.isArray(o.ignoreDelimiters)) { + o.ignoreDelimiters = [o.ignoreDelimiters]; + } + + o.ignoreDelimiters.forEach(function(delimiterPair) { + if (!delimiterPair.start || !delimiterPair.end) + return; + + reIgnoreStr = escapeRegex(delimiterPair.start) + + "[\\s\\S]*?" + + escapeRegex(delimiterPair.end); + + reIgnore = new RegExp(reIgnoreStr, "ig"); + + s = s.replace(reIgnore, function(match) { + return match.replace(/./g, " "); + }); + }); + } + + lex = new Lexer(s); + + lex.on("warning", function(ev) { + warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data)); + }); + + lex.on("error", function(ev) { + errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data)); + }); + + lex.on("fatal", function(ev) { + quit("E041", ev.line, ev.from); + }); + + lex.on("Identifier", function(ev) { + emitter.emit("Identifier", ev); + }); + + lex.on("String", function(ev) { + emitter.emit("String", ev); + }); + + lex.on("Number", function(ev) { + emitter.emit("Number", ev); + }); + + lex.start(); + for (var name in o) { + if (_.has(o, name)) { + checkOption(name, state.tokens.curr); + } + } + + assume(); + combine(predefined, g || {}); + comma.first = true; + + try { + advance(); + switch (state.tokens.next.id) { + case "{": + case "[": + destructuringAssignOrJsonValue(); + break; + default: + directives(); + + if (state.directive["use strict"]) { + if (state.option.strict !== "global") { + warning("W097", state.tokens.prev); + } + } + + statements(); + } + + if (state.tokens.next.id !== "(end)") { + quit("E041", state.tokens.curr.line); + } + + state.funct["(scope)"].unstack(); + + } catch (err) { + if (err && err.name === "JSHintError") { + var nt = state.tokens.next || {}; + JSHINT.errors.push({ + scope : "(main)", + raw : err.raw, + code : err.code, + reason : err.message, + line : err.line || nt.line, + character : err.character || nt.from + }, null); + } else { + throw err; + } + } + + if (JSHINT.scope === "(main)") { + o = o || {}; + + for (i = 0; i < JSHINT.internals.length; i += 1) { + k = JSHINT.internals[i]; + o.scope = k.elem; + itself(k.value, o, g); + } + } + + return JSHINT.errors.length === 0; + }; + itself.addModule = function(func) { + extraModules.push(func); + }; + + itself.addModule(style.register); + itself.data = function() { + var data = { + functions: [], + options: state.option + }; + + var fu, f, i, j, n, globals; + + if (itself.errors.length) { + data.errors = itself.errors; + } + + if (state.jsonMode) { + data.json = true; + } + + var impliedGlobals = state.funct["(scope)"].getImpliedGlobals(); + if (impliedGlobals.length > 0) { + data.implieds = impliedGlobals; + } + + if (urls.length > 0) { + data.urls = urls; + } + + globals = state.funct["(scope)"].getUsedOrDefinedGlobals(); + if (globals.length > 0) { + data.globals = globals; + } + + for (i = 1; i < functions.length; i += 1) { + f = functions[i]; + fu = {}; + + for (j = 0; j < functionicity.length; j += 1) { + fu[functionicity[j]] = []; + } + + for (j = 0; j < functionicity.length; j += 1) { + if (fu[functionicity[j]].length === 0) { + delete fu[functionicity[j]]; + } + } + + fu.name = f["(name)"]; + fu.param = f["(params)"]; + fu.line = f["(line)"]; + fu.character = f["(character)"]; + fu.last = f["(last)"]; + fu.lastcharacter = f["(lastcharacter)"]; + + fu.metrics = { + complexity: f["(metrics)"].ComplexityCount, + parameters: f["(metrics)"].arity, + statements: f["(metrics)"].statementCount + }; + + data.functions.push(fu); + } + + var unuseds = state.funct["(scope)"].getUnuseds(); + if (unuseds.length > 0) { + data.unused = unuseds; + } + + for (n in member) { + if (typeof member[n] === "number") { + data.member = member; + break; + } + } + + return data; + }; + + itself.jshint = itself; + + return itself; +}()); +if (typeof exports === "object" && exports) { + exports.JSHINT = JSHINT; +} + +},{"../lodash":"/node_modules/jshint/lodash.js","./lex.js":"/node_modules/jshint/src/lex.js","./messages.js":"/node_modules/jshint/src/messages.js","./options.js":"/node_modules/jshint/src/options.js","./reg.js":"/node_modules/jshint/src/reg.js","./scope-manager.js":"/node_modules/jshint/src/scope-manager.js","./state.js":"/node_modules/jshint/src/state.js","./style.js":"/node_modules/jshint/src/style.js","./vars.js":"/node_modules/jshint/src/vars.js","events":"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/lex.js":[function(_dereq_,module,exports){ + +"use strict"; + +var _ = _dereq_("../lodash"); +var events = _dereq_("events"); +var reg = _dereq_("./reg.js"); +var state = _dereq_("./state.js").state; + +var unicodeData = _dereq_("../data/ascii-identifier-data.js"); +var asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable; +var asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable; + +var Token = { + Identifier: 1, + Punctuator: 2, + NumericLiteral: 3, + StringLiteral: 4, + Comment: 5, + Keyword: 6, + NullLiteral: 7, + BooleanLiteral: 8, + RegExp: 9, + TemplateHead: 10, + TemplateMiddle: 11, + TemplateTail: 12, + NoSubstTemplate: 13 +}; + +var Context = { + Block: 1, + Template: 2 +}; + +function asyncTrigger() { + var _checks = []; + + return { + push: function(fn) { + _checks.push(fn); + }, + + check: function() { + for (var check = 0; check < _checks.length; ++check) { + _checks[check](); + } + + _checks.splice(0, _checks.length); + } + }; +} +function Lexer(source) { + var lines = source; + + if (typeof lines === "string") { + lines = lines + .replace(/\r\n/g, "\n") + .replace(/\r/g, "\n") + .split("\n"); + } + + if (lines[0] && lines[0].substr(0, 2) === "#!") { + if (lines[0].indexOf("node") !== -1) { + state.option.node = true; + } + lines[0] = ""; + } + + this.emitter = new events.EventEmitter(); + this.source = source; + this.setLines(lines); + this.prereg = true; + + this.line = 0; + this.char = 1; + this.from = 1; + this.input = ""; + this.inComment = false; + this.context = []; + this.templateStarts = []; + + for (var i = 0; i < state.option.indent; i += 1) { + state.tab += " "; + } + this.ignoreLinterErrors = false; +} + +Lexer.prototype = { + _lines: [], + + inContext: function(ctxType) { + return this.context.length > 0 && this.context[this.context.length - 1].type === ctxType; + }, + + pushContext: function(ctxType) { + this.context.push({ type: ctxType }); + }, + + popContext: function() { + return this.context.pop(); + }, + + isContext: function(context) { + return this.context.length > 0 && this.context[this.context.length - 1] === context; + }, + + currentContext: function() { + return this.context.length > 0 && this.context[this.context.length - 1]; + }, + + getLines: function() { + this._lines = state.lines; + return this._lines; + }, + + setLines: function(val) { + this._lines = val; + state.lines = this._lines; + }, + peek: function(i) { + return this.input.charAt(i || 0); + }, + skip: function(i) { + i = i || 1; + this.char += i; + this.input = this.input.slice(i); + }, + on: function(names, listener) { + names.split(" ").forEach(function(name) { + this.emitter.on(name, listener); + }.bind(this)); + }, + trigger: function() { + this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments)); + }, + triggerAsync: function(type, args, checks, fn) { + checks.push(function() { + if (fn()) { + this.trigger(type, args); + } + }.bind(this)); + }, + scanPunctuator: function() { + var ch1 = this.peek(); + var ch2, ch3, ch4; + + switch (ch1) { + case ".": + if ((/^[0-9]$/).test(this.peek(1))) { + return null; + } + if (this.peek(1) === "." && this.peek(2) === ".") { + return { + type: Token.Punctuator, + value: "..." + }; + } + case "(": + case ")": + case ";": + case ",": + case "[": + case "]": + case ":": + case "~": + case "?": + return { + type: Token.Punctuator, + value: ch1 + }; + case "{": + this.pushContext(Context.Block); + return { + type: Token.Punctuator, + value: ch1 + }; + case "}": + if (this.inContext(Context.Block)) { + this.popContext(); + } + return { + type: Token.Punctuator, + value: ch1 + }; + case "#": + return { + type: Token.Punctuator, + value: ch1 + }; + case "": + return null; + } + + ch2 = this.peek(1); + ch3 = this.peek(2); + ch4 = this.peek(3); + + if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") { + return { + type: Token.Punctuator, + value: ">>>=" + }; + } + + if (ch1 === "=" && ch2 === "=" && ch3 === "=") { + return { + type: Token.Punctuator, + value: "===" + }; + } + + if (ch1 === "!" && ch2 === "=" && ch3 === "=") { + return { + type: Token.Punctuator, + value: "!==" + }; + } + + if (ch1 === ">" && ch2 === ">" && ch3 === ">") { + return { + type: Token.Punctuator, + value: ">>>" + }; + } + + if (ch1 === "<" && ch2 === "<" && ch3 === "=") { + return { + type: Token.Punctuator, + value: "<<=" + }; + } + + if (ch1 === ">" && ch2 === ">" && ch3 === "=") { + return { + type: Token.Punctuator, + value: ">>=" + }; + } + if (ch1 === "=" && ch2 === ">") { + return { + type: Token.Punctuator, + value: ch1 + ch2 + }; + } + if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) { + return { + type: Token.Punctuator, + value: ch1 + ch2 + }; + } + + if ("<>=!+-*%&|^".indexOf(ch1) >= 0) { + if (ch2 === "=") { + return { + type: Token.Punctuator, + value: ch1 + ch2 + }; + } + + return { + type: Token.Punctuator, + value: ch1 + }; + } + + if (ch1 === "/") { + if (ch2 === "=") { + return { + type: Token.Punctuator, + value: "/=" + }; + } + + return { + type: Token.Punctuator, + value: "/" + }; + } + + return null; + }, + scanComments: function() { + var ch1 = this.peek(); + var ch2 = this.peek(1); + var rest = this.input.substr(2); + var startLine = this.line; + var startChar = this.char; + var self = this; + + function commentToken(label, body, opt) { + var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"]; + var isSpecial = false; + var value = label + body; + var commentType = "plain"; + opt = opt || {}; + + if (opt.isMultiline) { + value += "*/"; + } + + body = body.replace(/\n/g, " "); + + if (label === "/*" && reg.fallsThrough.test(body)) { + isSpecial = true; + commentType = "falls through"; + } + + special.forEach(function(str) { + if (isSpecial) { + return; + } + if (label === "//" && str !== "jshint") { + return; + } + + if (body.charAt(str.length) === " " && body.substr(0, str.length) === str) { + isSpecial = true; + label = label + str; + body = body.substr(str.length); + } + + if (!isSpecial && body.charAt(0) === " " && body.charAt(str.length + 1) === " " && + body.substr(1, str.length) === str) { + isSpecial = true; + label = label + " " + str; + body = body.substr(str.length + 1); + } + + if (!isSpecial) { + return; + } + + switch (str) { + case "member": + commentType = "members"; + break; + case "global": + commentType = "globals"; + break; + default: + var options = body.split(":").map(function(v) { + return v.replace(/^\s+/, "").replace(/\s+$/, ""); + }); + + if (options.length === 2) { + switch (options[0]) { + case "ignore": + switch (options[1]) { + case "start": + self.ignoringLinterErrors = true; + isSpecial = false; + break; + case "end": + self.ignoringLinterErrors = false; + isSpecial = false; + break; + } + } + } + + commentType = str; + } + }); + + return { + type: Token.Comment, + commentType: commentType, + value: value, + body: body, + isSpecial: isSpecial, + isMultiline: opt.isMultiline || false, + isMalformed: opt.isMalformed || false + }; + } + if (ch1 === "*" && ch2 === "/") { + this.trigger("error", { + code: "E018", + line: startLine, + character: startChar + }); + + this.skip(2); + return null; + } + if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) { + return null; + } + if (ch2 === "/") { + this.skip(this.input.length); // Skip to the EOL. + return commentToken("//", rest); + } + + var body = ""; + if (ch2 === "*") { + this.inComment = true; + this.skip(2); + + while (this.peek() !== "*" || this.peek(1) !== "/") { + if (this.peek() === "") { // End of Line + body += "\n"; + if (!this.nextLine()) { + this.trigger("error", { + code: "E017", + line: startLine, + character: startChar + }); + + this.inComment = false; + return commentToken("/*", body, { + isMultiline: true, + isMalformed: true + }); + } + } else { + body += this.peek(); + this.skip(); + } + } + + this.skip(2); + this.inComment = false; + return commentToken("/*", body, { isMultiline: true }); + } + }, + scanKeyword: function() { + var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input); + var keywords = [ + "if", "in", "do", "var", "for", "new", + "try", "let", "this", "else", "case", + "void", "with", "enum", "while", "break", + "catch", "throw", "const", "yield", "class", + "super", "return", "typeof", "delete", + "switch", "export", "import", "default", + "finally", "extends", "function", "continue", + "debugger", "instanceof" + ]; + + if (result && keywords.indexOf(result[0]) >= 0) { + return { + type: Token.Keyword, + value: result[0] + }; + } + + return null; + }, + scanIdentifier: function() { + var id = ""; + var index = 0; + var type, char; + + function isNonAsciiIdentifierStart(code) { + return code > 256; + } + + function isNonAsciiIdentifierPart(code) { + return code > 256; + } + + function isHexDigit(str) { + return (/^[0-9a-fA-F]$/).test(str); + } + + var readUnicodeEscapeSequence = function() { + index += 1; + + if (this.peek(index) !== "u") { + return null; + } + + var ch1 = this.peek(index + 1); + var ch2 = this.peek(index + 2); + var ch3 = this.peek(index + 3); + var ch4 = this.peek(index + 4); + var code; + + if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) { + code = parseInt(ch1 + ch2 + ch3 + ch4, 16); + + if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) { + index += 5; + return "\\u" + ch1 + ch2 + ch3 + ch4; + } + + return null; + } + + return null; + }.bind(this); + + var getIdentifierStart = function() { + var chr = this.peek(index); + var code = chr.charCodeAt(0); + + if (code === 92) { + return readUnicodeEscapeSequence(); + } + + if (code < 128) { + if (asciiIdentifierStartTable[code]) { + index += 1; + return chr; + } + + return null; + } + + if (isNonAsciiIdentifierStart(code)) { + index += 1; + return chr; + } + + return null; + }.bind(this); + + var getIdentifierPart = function() { + var chr = this.peek(index); + var code = chr.charCodeAt(0); + + if (code === 92) { + return readUnicodeEscapeSequence(); + } + + if (code < 128) { + if (asciiIdentifierPartTable[code]) { + index += 1; + return chr; + } + + return null; + } + + if (isNonAsciiIdentifierPart(code)) { + index += 1; + return chr; + } + + return null; + }.bind(this); + + function removeEscapeSequences(id) { + return id.replace(/\\u([0-9a-fA-F]{4})/g, function(m0, codepoint) { + return String.fromCharCode(parseInt(codepoint, 16)); + }); + } + + char = getIdentifierStart(); + if (char === null) { + return null; + } + + id = char; + for (;;) { + char = getIdentifierPart(); + + if (char === null) { + break; + } + + id += char; + } + + switch (id) { + case "true": + case "false": + type = Token.BooleanLiteral; + break; + case "null": + type = Token.NullLiteral; + break; + default: + type = Token.Identifier; + } + + return { + type: type, + value: removeEscapeSequences(id), + text: id, + tokenLength: id.length + }; + }, + scanNumericLiteral: function() { + var index = 0; + var value = ""; + var length = this.input.length; + var char = this.peek(index); + var bad; + var isAllowedDigit = isDecimalDigit; + var base = 10; + var isLegacy = false; + + function isDecimalDigit(str) { + return (/^[0-9]$/).test(str); + } + + function isOctalDigit(str) { + return (/^[0-7]$/).test(str); + } + + function isBinaryDigit(str) { + return (/^[01]$/).test(str); + } + + function isHexDigit(str) { + return (/^[0-9a-fA-F]$/).test(str); + } + + function isIdentifierStart(ch) { + return (ch === "$") || (ch === "_") || (ch === "\\") || + (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); + } + + if (char !== "." && !isDecimalDigit(char)) { + return null; + } + + if (char !== ".") { + value = this.peek(index); + index += 1; + char = this.peek(index); + + if (value === "0") { + if (char === "x" || char === "X") { + isAllowedDigit = isHexDigit; + base = 16; + + index += 1; + value += char; + } + if (char === "o" || char === "O") { + isAllowedDigit = isOctalDigit; + base = 8; + + if (!state.inES6(true)) { + this.trigger("warning", { + code: "W119", + line: this.line, + character: this.char, + data: [ "Octal integer literal", "6" ] + }); + } + + index += 1; + value += char; + } + if (char === "b" || char === "B") { + isAllowedDigit = isBinaryDigit; + base = 2; + + if (!state.inES6(true)) { + this.trigger("warning", { + code: "W119", + line: this.line, + character: this.char, + data: [ "Binary integer literal", "6" ] + }); + } + + index += 1; + value += char; + } + if (isOctalDigit(char)) { + isAllowedDigit = isOctalDigit; + base = 8; + isLegacy = true; + bad = false; + + index += 1; + value += char; + } + + if (!isOctalDigit(char) && isDecimalDigit(char)) { + index += 1; + value += char; + } + } + + while (index < length) { + char = this.peek(index); + + if (isLegacy && isDecimalDigit(char)) { + bad = true; + } else if (!isAllowedDigit(char)) { + break; + } + value += char; + index += 1; + } + + if (isAllowedDigit !== isDecimalDigit) { + if (!isLegacy && value.length <= 2) { // 0x + return { + type: Token.NumericLiteral, + value: value, + isMalformed: true + }; + } + + if (index < length) { + char = this.peek(index); + if (isIdentifierStart(char)) { + return null; + } + } + + return { + type: Token.NumericLiteral, + value: value, + base: base, + isLegacy: isLegacy, + isMalformed: false + }; + } + } + + if (char === ".") { + value += char; + index += 1; + + while (index < length) { + char = this.peek(index); + if (!isDecimalDigit(char)) { + break; + } + value += char; + index += 1; + } + } + + if (char === "e" || char === "E") { + value += char; + index += 1; + char = this.peek(index); + + if (char === "+" || char === "-") { + value += this.peek(index); + index += 1; + } + + char = this.peek(index); + if (isDecimalDigit(char)) { + value += char; + index += 1; + + while (index < length) { + char = this.peek(index); + if (!isDecimalDigit(char)) { + break; + } + value += char; + index += 1; + } + } else { + return null; + } + } + + if (index < length) { + char = this.peek(index); + if (isIdentifierStart(char)) { + return null; + } + } + + return { + type: Token.NumericLiteral, + value: value, + base: base, + isMalformed: !isFinite(value) + }; + }, + scanEscapeSequence: function(checks) { + var allowNewLine = false; + var jump = 1; + this.skip(); + var char = this.peek(); + + switch (char) { + case "'": + this.triggerAsync("warning", { + code: "W114", + line: this.line, + character: this.char, + data: [ "\\'" ] + }, checks, function() {return state.jsonMode; }); + break; + case "b": + char = "\\b"; + break; + case "f": + char = "\\f"; + break; + case "n": + char = "\\n"; + break; + case "r": + char = "\\r"; + break; + case "t": + char = "\\t"; + break; + case "0": + char = "\\0"; + var n = parseInt(this.peek(1), 10); + this.triggerAsync("warning", { + code: "W115", + line: this.line, + character: this.char + }, checks, + function() { return n >= 0 && n <= 7 && state.isStrict(); }); + break; + case "u": + var hexCode = this.input.substr(1, 4); + var code = parseInt(hexCode, 16); + if (isNaN(code)) { + this.trigger("warning", { + code: "W052", + line: this.line, + character: this.char, + data: [ "u" + hexCode ] + }); + } + char = String.fromCharCode(code); + jump = 5; + break; + case "v": + this.triggerAsync("warning", { + code: "W114", + line: this.line, + character: this.char, + data: [ "\\v" ] + }, checks, function() { return state.jsonMode; }); + + char = "\v"; + break; + case "x": + var x = parseInt(this.input.substr(1, 2), 16); + + this.triggerAsync("warning", { + code: "W114", + line: this.line, + character: this.char, + data: [ "\\x-" ] + }, checks, function() { return state.jsonMode; }); + + char = String.fromCharCode(x); + jump = 3; + break; + case "\\": + char = "\\\\"; + break; + case "\"": + char = "\\\""; + break; + case "/": + break; + case "": + allowNewLine = true; + char = ""; + break; + } + + return { char: char, jump: jump, allowNewLine: allowNewLine }; + }, + scanTemplateLiteral: function(checks) { + var tokenType; + var value = ""; + var ch; + var startLine = this.line; + var startChar = this.char; + var depth = this.templateStarts.length; + + if (!state.inES6(true)) { + return null; + } else if (this.peek() === "`") { + tokenType = Token.TemplateHead; + this.templateStarts.push({ line: this.line, char: this.char }); + depth = this.templateStarts.length; + this.skip(1); + this.pushContext(Context.Template); + } else if (this.inContext(Context.Template) && this.peek() === "}") { + tokenType = Token.TemplateMiddle; + } else { + return null; + } + + while (this.peek() !== "`") { + while ((ch = this.peek()) === "") { + value += "\n"; + if (!this.nextLine()) { + var startPos = this.templateStarts.pop(); + this.trigger("error", { + code: "E052", + line: startPos.line, + character: startPos.char + }); + return { + type: tokenType, + value: value, + startLine: startLine, + startChar: startChar, + isUnclosed: true, + depth: depth, + context: this.popContext() + }; + } + } + + if (ch === '$' && this.peek(1) === '{') { + value += '${'; + this.skip(2); + return { + type: tokenType, + value: value, + startLine: startLine, + startChar: startChar, + isUnclosed: false, + depth: depth, + context: this.currentContext() + }; + } else if (ch === '\\') { + var escape = this.scanEscapeSequence(checks); + value += escape.char; + this.skip(escape.jump); + } else if (ch !== '`') { + value += ch; + this.skip(1); + } + } + tokenType = tokenType === Token.TemplateHead ? Token.NoSubstTemplate : Token.TemplateTail; + this.skip(1); + this.templateStarts.pop(); + + return { + type: tokenType, + value: value, + startLine: startLine, + startChar: startChar, + isUnclosed: false, + depth: depth, + context: this.popContext() + }; + }, + scanStringLiteral: function(checks) { + var quote = this.peek(); + if (quote !== "\"" && quote !== "'") { + return null; + } + this.triggerAsync("warning", { + code: "W108", + line: this.line, + character: this.char // +1? + }, checks, function() { return state.jsonMode && quote !== "\""; }); + + var value = ""; + var startLine = this.line; + var startChar = this.char; + var allowNewLine = false; + + this.skip(); + + while (this.peek() !== quote) { + if (this.peek() === "") { // End Of Line + + if (!allowNewLine) { + this.trigger("warning", { + code: "W112", + line: this.line, + character: this.char + }); + } else { + allowNewLine = false; + + this.triggerAsync("warning", { + code: "W043", + line: this.line, + character: this.char + }, checks, function() { return !state.option.multistr; }); + + this.triggerAsync("warning", { + code: "W042", + line: this.line, + character: this.char + }, checks, function() { return state.jsonMode && state.option.multistr; }); + } + + if (!this.nextLine()) { + this.trigger("error", { + code: "E029", + line: startLine, + character: startChar + }); + + return { + type: Token.StringLiteral, + value: value, + startLine: startLine, + startChar: startChar, + isUnclosed: true, + quote: quote + }; + } + + } else { // Any character other than End Of Line + + allowNewLine = false; + var char = this.peek(); + var jump = 1; // A length of a jump, after we're done + + if (char < " ") { + this.trigger("warning", { + code: "W113", + line: this.line, + character: this.char, + data: [ "" ] + }); + } + if (char === "\\") { + var parsed = this.scanEscapeSequence(checks); + char = parsed.char; + jump = parsed.jump; + allowNewLine = parsed.allowNewLine; + } + + value += char; + this.skip(jump); + } + } + + this.skip(); + return { + type: Token.StringLiteral, + value: value, + startLine: startLine, + startChar: startChar, + isUnclosed: false, + quote: quote + }; + }, + scanRegExp: function() { + var index = 0; + var length = this.input.length; + var char = this.peek(); + var value = char; + var body = ""; + var flags = []; + var malformed = false; + var isCharSet = false; + var terminated; + + var scanUnexpectedChars = function() { + if (char < " ") { + malformed = true; + this.trigger("warning", { + code: "W048", + line: this.line, + character: this.char + }); + } + if (char === "<") { + malformed = true; + this.trigger("warning", { + code: "W049", + line: this.line, + character: this.char, + data: [ char ] + }); + } + }.bind(this); + if (!this.prereg || char !== "/") { + return null; + } + + index += 1; + terminated = false; + + while (index < length) { + char = this.peek(index); + value += char; + body += char; + + if (isCharSet) { + if (char === "]") { + if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") { + isCharSet = false; + } + } + + if (char === "\\") { + index += 1; + char = this.peek(index); + body += char; + value += char; + + scanUnexpectedChars(); + } + + index += 1; + continue; + } + + if (char === "\\") { + index += 1; + char = this.peek(index); + body += char; + value += char; + + scanUnexpectedChars(); + + if (char === "/") { + index += 1; + continue; + } + + if (char === "[") { + index += 1; + continue; + } + } + + if (char === "[") { + isCharSet = true; + index += 1; + continue; + } + + if (char === "/") { + body = body.substr(0, body.length - 1); + terminated = true; + index += 1; + break; + } + + index += 1; + } + + if (!terminated) { + this.trigger("error", { + code: "E015", + line: this.line, + character: this.from + }); + + return void this.trigger("fatal", { + line: this.line, + from: this.from + }); + } + + while (index < length) { + char = this.peek(index); + if (!/[gim]/.test(char)) { + break; + } + flags.push(char); + value += char; + index += 1; + } + + try { + new RegExp(body, flags.join("")); + } catch (err) { + malformed = true; + this.trigger("error", { + code: "E016", + line: this.line, + character: this.char, + data: [ err.message ] // Platform dependent! + }); + } + + return { + type: Token.RegExp, + value: value, + flags: flags, + isMalformed: malformed + }; + }, + scanNonBreakingSpaces: function() { + return state.option.nonbsp ? + this.input.search(/(\u00A0)/) : -1; + }, + scanUnsafeChars: function() { + return this.input.search(reg.unsafeChars); + }, + next: function(checks) { + this.from = this.char; + var start; + if (/\s/.test(this.peek())) { + start = this.char; + + while (/\s/.test(this.peek())) { + this.from += 1; + this.skip(); + } + } + + var match = this.scanComments() || + this.scanStringLiteral(checks) || + this.scanTemplateLiteral(checks); + + if (match) { + return match; + } + + match = + this.scanRegExp() || + this.scanPunctuator() || + this.scanKeyword() || + this.scanIdentifier() || + this.scanNumericLiteral(); + + if (match) { + this.skip(match.tokenLength || match.value.length); + return match; + } + + return null; + }, + nextLine: function() { + var char; + + if (this.line >= this.getLines().length) { + return false; + } + + this.input = this.getLines()[this.line]; + this.line += 1; + this.char = 1; + this.from = 1; + + var inputTrimmed = this.input.trim(); + + var startsWith = function() { + return _.some(arguments, function(prefix) { + return inputTrimmed.indexOf(prefix) === 0; + }); + }; + + var endsWith = function() { + return _.some(arguments, function(suffix) { + return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1; + }); + }; + if (this.ignoringLinterErrors === true) { + if (!startsWith("/*", "//") && !(this.inComment && endsWith("*/"))) { + this.input = ""; + } + } + + char = this.scanNonBreakingSpaces(); + if (char >= 0) { + this.trigger("warning", { code: "W125", line: this.line, character: char + 1 }); + } + + this.input = this.input.replace(/\t/g, state.tab); + char = this.scanUnsafeChars(); + + if (char >= 0) { + this.trigger("warning", { code: "W100", line: this.line, character: char }); + } + + if (!this.ignoringLinterErrors && state.option.maxlen && + state.option.maxlen < this.input.length) { + var inComment = this.inComment || + startsWith.call(inputTrimmed, "//") || + startsWith.call(inputTrimmed, "/*"); + + var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed); + + if (shouldTriggerError) { + this.trigger("warning", { code: "W101", line: this.line, character: this.input.length }); + } + } + + return true; + }, + start: function() { + this.nextLine(); + }, + token: function() { + var checks = asyncTrigger(); + var token; + + + function isReserved(token, isProperty) { + if (!token.reserved) { + return false; + } + var meta = token.meta; + + if (meta && meta.isFutureReservedWord && state.inES5()) { + if (!meta.es5) { + return false; + } + if (meta.strictOnly) { + if (!state.option.strict && !state.isStrict()) { + return false; + } + } + + if (isProperty) { + return false; + } + } + + return true; + } + var create = function(type, value, isProperty, token) { + var obj; + + if (type !== "(endline)" && type !== "(end)") { + this.prereg = false; + } + + if (type === "(punctuator)") { + switch (value) { + case ".": + case ")": + case "~": + case "#": + case "]": + case "++": + case "--": + this.prereg = false; + break; + default: + this.prereg = true; + } + + obj = Object.create(state.syntax[value] || state.syntax["(error)"]); + } + + if (type === "(identifier)") { + if (value === "return" || value === "case" || value === "typeof") { + this.prereg = true; + } + + if (_.has(state.syntax, value)) { + obj = Object.create(state.syntax[value] || state.syntax["(error)"]); + if (!isReserved(obj, isProperty && type === "(identifier)")) { + obj = null; + } + } + } + + if (!obj) { + obj = Object.create(state.syntax[type]); + } + + obj.identifier = (type === "(identifier)"); + obj.type = obj.type || type; + obj.value = value; + obj.line = this.line; + obj.character = this.char; + obj.from = this.from; + if (obj.identifier && token) obj.raw_text = token.text || token.value; + if (token && token.startLine && token.startLine !== this.line) { + obj.startLine = token.startLine; + } + if (token && token.context) { + obj.context = token.context; + } + if (token && token.depth) { + obj.depth = token.depth; + } + if (token && token.isUnclosed) { + obj.isUnclosed = token.isUnclosed; + } + + if (isProperty && obj.identifier) { + obj.isProperty = isProperty; + } + + obj.check = checks.check; + + return obj; + }.bind(this); + + for (;;) { + if (!this.input.length) { + if (this.nextLine()) { + return create("(endline)", ""); + } + + if (this.exhausted) { + return null; + } + + this.exhausted = true; + return create("(end)", ""); + } + + token = this.next(checks); + + if (!token) { + if (this.input.length) { + this.trigger("error", { + code: "E024", + line: this.line, + character: this.char, + data: [ this.peek() ] + }); + + this.input = ""; + } + + continue; + } + + switch (token.type) { + case Token.StringLiteral: + this.triggerAsync("String", { + line: this.line, + char: this.char, + from: this.from, + startLine: token.startLine, + startChar: token.startChar, + value: token.value, + quote: token.quote + }, checks, function() { return true; }); + + return create("(string)", token.value, null, token); + + case Token.TemplateHead: + this.trigger("TemplateHead", { + line: this.line, + char: this.char, + from: this.from, + startLine: token.startLine, + startChar: token.startChar, + value: token.value + }); + return create("(template)", token.value, null, token); + + case Token.TemplateMiddle: + this.trigger("TemplateMiddle", { + line: this.line, + char: this.char, + from: this.from, + startLine: token.startLine, + startChar: token.startChar, + value: token.value + }); + return create("(template middle)", token.value, null, token); + + case Token.TemplateTail: + this.trigger("TemplateTail", { + line: this.line, + char: this.char, + from: this.from, + startLine: token.startLine, + startChar: token.startChar, + value: token.value + }); + return create("(template tail)", token.value, null, token); + + case Token.NoSubstTemplate: + this.trigger("NoSubstTemplate", { + line: this.line, + char: this.char, + from: this.from, + startLine: token.startLine, + startChar: token.startChar, + value: token.value + }); + return create("(no subst template)", token.value, null, token); + + case Token.Identifier: + this.triggerAsync("Identifier", { + line: this.line, + char: this.char, + from: this.form, + name: token.value, + raw_name: token.text, + isProperty: state.tokens.curr.id === "." + }, checks, function() { return true; }); + case Token.Keyword: + case Token.NullLiteral: + case Token.BooleanLiteral: + return create("(identifier)", token.value, state.tokens.curr.id === ".", token); + + case Token.NumericLiteral: + if (token.isMalformed) { + this.trigger("warning", { + code: "W045", + line: this.line, + character: this.char, + data: [ token.value ] + }); + } + + this.triggerAsync("warning", { + code: "W114", + line: this.line, + character: this.char, + data: [ "0x-" ] + }, checks, function() { return token.base === 16 && state.jsonMode; }); + + this.triggerAsync("warning", { + code: "W115", + line: this.line, + character: this.char + }, checks, function() { + return state.isStrict() && token.base === 8 && token.isLegacy; + }); + + this.trigger("Number", { + line: this.line, + char: this.char, + from: this.from, + value: token.value, + base: token.base, + isMalformed: token.malformed + }); + + return create("(number)", token.value); + + case Token.RegExp: + return create("(regexp)", token.value); + + case Token.Comment: + state.tokens.curr.comment = true; + + if (token.isSpecial) { + return { + id: '(comment)', + value: token.value, + body: token.body, + type: token.commentType, + isSpecial: token.isSpecial, + line: this.line, + character: this.char, + from: this.from + }; + } + + break; + + case "": + break; + + default: + return create("(punctuator)", token.value); + } + } + } +}; + +exports.Lexer = Lexer; +exports.Context = Context; + +},{"../data/ascii-identifier-data.js":"/node_modules/jshint/data/ascii-identifier-data.js","../lodash":"/node_modules/jshint/lodash.js","./reg.js":"/node_modules/jshint/src/reg.js","./state.js":"/node_modules/jshint/src/state.js","events":"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/messages.js":[function(_dereq_,module,exports){ +"use strict"; + +var _ = _dereq_("../lodash"); + +var errors = { + E001: "Bad option: '{a}'.", + E002: "Bad option value.", + E003: "Expected a JSON value.", + E004: "Input is neither a string nor an array of strings.", + E005: "Input is empty.", + E006: "Unexpected early end of program.", + E007: "Missing \"use strict\" statement.", + E008: "Strict violation.", + E009: "Option 'validthis' can't be used in a global scope.", + E010: "'with' is not allowed in strict mode.", + E011: "'{a}' has already been declared.", + E012: "const '{a}' is initialized to 'undefined'.", + E013: "Attempting to override '{a}' which is a constant.", + E014: "A regular expression literal can be confused with '/='.", + E015: "Unclosed regular expression.", + E016: "Invalid regular expression.", + E017: "Unclosed comment.", + E018: "Unbegun comment.", + E019: "Unmatched '{a}'.", + E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", + E021: "Expected '{a}' and instead saw '{b}'.", + E022: "Line breaking error '{a}'.", + E023: "Missing '{a}'.", + E024: "Unexpected '{a}'.", + E025: "Missing ':' on a case clause.", + E026: "Missing '}' to match '{' from line {a}.", + E027: "Missing ']' to match '[' from line {a}.", + E028: "Illegal comma.", + E029: "Unclosed string.", + E030: "Expected an identifier and instead saw '{a}'.", + E031: "Bad assignment.", // FIXME: Rephrase + E032: "Expected a small integer or 'false' and instead saw '{a}'.", + E033: "Expected an operator and instead saw '{a}'.", + E034: "get/set are ES5 features.", + E035: "Missing property name.", + E036: "Expected to see a statement and instead saw a block.", + E037: null, + E038: null, + E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.", + E040: "Each value should have its own case label.", + E041: "Unrecoverable syntax error.", + E042: "Stopping.", + E043: "Too many errors.", + E044: null, + E045: "Invalid for each loop.", + E046: "A yield statement shall be within a generator function (with syntax: `function*`)", + E047: null, + E048: "{a} declaration not directly within block.", + E049: "A {a} cannot be named '{b}'.", + E050: "Mozilla requires the yield expression to be parenthesized here.", + E051: null, + E052: "Unclosed template literal.", + E053: "Export declaration must be in global scope.", + E054: "Class properties must be methods. Expected '(' but instead saw '{a}'.", + E055: "The '{a}' option cannot be set after any executable code.", + E056: "'{a}' was used before it was declared, which is illegal for '{b}' variables.", + E057: "Invalid meta property: '{a}.{b}'.", + E058: "Missing semicolon." +}; + +var warnings = { + W001: "'hasOwnProperty' is a really bad name.", + W002: "Value of '{a}' may be overwritten in IE 8 and earlier.", + W003: "'{a}' was used before it was defined.", + W004: "'{a}' is already defined.", + W005: "A dot following a number can be confused with a decimal point.", + W006: "Confusing minuses.", + W007: "Confusing plusses.", + W008: "A leading decimal point can be confused with a dot: '{a}'.", + W009: "The array literal notation [] is preferable.", + W010: "The object literal notation {} is preferable.", + W011: null, + W012: null, + W013: null, + W014: "Bad line breaking before '{a}'.", + W015: null, + W016: "Unexpected use of '{a}'.", + W017: "Bad operand.", + W018: "Confusing use of '{a}'.", + W019: "Use the isNaN function to compare with NaN.", + W020: "Read only.", + W021: "Reassignment of '{a}', which is is a {b}. " + + "Use 'var' or 'let' to declare bindings that may change.", + W022: "Do not assign to the exception parameter.", + W023: "Expected an identifier in an assignment and instead saw a function invocation.", + W024: "Expected an identifier and instead saw '{a}' (a reserved word).", + W025: "Missing name in function declaration.", + W026: "Inner functions should be listed at the top of the outer function.", + W027: "Unreachable '{a}' after '{b}'.", + W028: "Label '{a}' on {b} statement.", + W030: "Expected an assignment or function call and instead saw an expression.", + W031: "Do not use 'new' for side effects.", + W032: "Unnecessary semicolon.", + W033: "Missing semicolon.", + W034: "Unnecessary directive \"{a}\".", + W035: "Empty block.", + W036: "Unexpected /*member '{a}'.", + W037: "'{a}' is a statement label.", + W038: "'{a}' used out of scope.", + W039: "'{a}' is not allowed.", + W040: "Possible strict violation.", + W041: "Use '{a}' to compare with '{b}'.", + W042: "Avoid EOL escaping.", + W043: "Bad escaping of EOL. Use option multistr if needed.", + W044: "Bad or unnecessary escaping.", /* TODO(caitp): remove W044 */ + W045: "Bad number '{a}'.", + W046: "Don't use extra leading zeros '{a}'.", + W047: "A trailing decimal point can be confused with a dot: '{a}'.", + W048: "Unexpected control character in regular expression.", + W049: "Unexpected escaped character '{a}' in regular expression.", + W050: "JavaScript URL.", + W051: "Variables should not be deleted.", + W052: "Unexpected '{a}'.", + W053: "Do not use {a} as a constructor.", + W054: "The Function constructor is a form of eval.", + W055: "A constructor name should start with an uppercase letter.", + W056: "Bad constructor.", + W057: "Weird construction. Is 'new' necessary?", + W058: "Missing '()' invoking a constructor.", + W059: "Avoid arguments.{a}.", + W060: "document.write can be a form of eval.", + W061: "eval can be harmful.", + W062: "Wrap an immediate function invocation in parens " + + "to assist the reader in understanding that the expression " + + "is the result of a function, and not the function itself.", + W063: "Math is not a function.", + W064: "Missing 'new' prefix when invoking a constructor.", + W065: "Missing radix parameter.", + W066: "Implied eval. Consider passing a function instead of a string.", + W067: "Bad invocation.", + W068: "Wrapping non-IIFE function literals in parens is unnecessary.", + W069: "['{a}'] is better written in dot notation.", + W070: "Extra comma. (it breaks older versions of IE)", + W071: "This function has too many statements. ({a})", + W072: "This function has too many parameters. ({a})", + W073: "Blocks are nested too deeply. ({a})", + W074: "This function's cyclomatic complexity is too high. ({a})", + W075: "Duplicate {a} '{b}'.", + W076: "Unexpected parameter '{a}' in get {b} function.", + W077: "Expected a single parameter in set {a} function.", + W078: "Setter is defined without getter.", + W079: "Redefinition of '{a}'.", + W080: "It's not necessary to initialize '{a}' to 'undefined'.", + W081: null, + W082: "Function declarations should not be placed in blocks. " + + "Use a function expression or move the statement to the top of " + + "the outer function.", + W083: "Don't make functions within a loop.", + W084: "Assignment in conditional expression", + W085: "Don't use 'with'.", + W086: "Expected a 'break' statement before '{a}'.", + W087: "Forgotten 'debugger' statement?", + W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.", + W089: "The body of a for in should be wrapped in an if statement to filter " + + "unwanted properties from the prototype.", + W090: "'{a}' is not a statement label.", + W091: null, + W093: "Did you mean to return a conditional instead of an assignment?", + W094: "Unexpected comma.", + W095: "Expected a string and instead saw {a}.", + W096: "The '{a}' key may produce unexpected results.", + W097: "Use the function form of \"use strict\".", + W098: "'{a}' is defined but never used.", + W099: null, + W100: "This character may get silently deleted by one or more browsers.", + W101: "Line is too long.", + W102: null, + W103: "The '{a}' property is deprecated.", + W104: "'{a}' is available in ES{b} (use 'esversion: {b}') or Mozilla JS extensions (use moz).", + W105: "Unexpected {a} in '{b}'.", + W106: "Identifier '{a}' is not in camel case.", + W107: "Script URL.", + W108: "Strings must use doublequote.", + W109: "Strings must use singlequote.", + W110: "Mixed double and single quotes.", + W112: "Unclosed string.", + W113: "Control character in string: {a}.", + W114: "Avoid {a}.", + W115: "Octal literals are not allowed in strict mode.", + W116: "Expected '{a}' and instead saw '{b}'.", + W117: "'{a}' is not defined.", + W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).", + W119: "'{a}' is only available in ES{b} (use 'esversion: {b}').", + W120: "You might be leaking a variable ({a}) here.", + W121: "Extending prototype of native object: '{a}'.", + W122: "Invalid typeof value '{a}'", + W123: "'{a}' is already defined in outer scope.", + W124: "A generator function shall contain a yield statement.", + W125: "This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp", + W126: "Unnecessary grouping operator.", + W127: "Unexpected use of a comma operator.", + W128: "Empty array elements require elision=true.", + W129: "'{a}' is defined in a future version of JavaScript. Use a " + + "different variable name to avoid migration issues.", + W130: "Invalid element after rest element.", + W131: "Invalid parameter after rest parameter.", + W132: "`var` declarations are forbidden. Use `let` or `const` instead.", + W133: "Invalid for-{a} loop left-hand-side: {b}.", + W134: "The '{a}' option is only available when linting ECMAScript {b} code.", + W135: "{a} may not be supported by non-browser environments.", + W136: "'{a}' must be in function scope.", + W137: "Empty destructuring.", + W138: "Regular parameters should not come after default parameters." +}; + +var info = { + I001: "Comma warnings can be turned off with 'laxcomma'.", + I002: null, + I003: "ES5 option is now set per default" +}; + +exports.errors = {}; +exports.warnings = {}; +exports.info = {}; + +_.each(errors, function(desc, code) { + exports.errors[code] = { code: code, desc: desc }; +}); + +_.each(warnings, function(desc, code) { + exports.warnings[code] = { code: code, desc: desc }; +}); + +_.each(info, function(desc, code) { + exports.info[code] = { code: code, desc: desc }; +}); + +},{"../lodash":"/node_modules/jshint/lodash.js"}],"/node_modules/jshint/src/name-stack.js":[function(_dereq_,module,exports){ +"use strict"; + +function NameStack() { + this._stack = []; +} + +Object.defineProperty(NameStack.prototype, "length", { + get: function() { + return this._stack.length; + } +}); +NameStack.prototype.push = function() { + this._stack.push(null); +}; +NameStack.prototype.pop = function() { + this._stack.pop(); +}; +NameStack.prototype.set = function(token) { + this._stack[this.length - 1] = token; +}; +NameStack.prototype.infer = function() { + var nameToken = this._stack[this.length - 1]; + var prefix = ""; + var type; + if (!nameToken || nameToken.type === "class") { + nameToken = this._stack[this.length - 2]; + } + + if (!nameToken) { + return "(empty)"; + } + + type = nameToken.type; + + if (type !== "(string)" && type !== "(number)" && type !== "(identifier)" && type !== "default") { + return "(expression)"; + } + + if (nameToken.accessorType) { + prefix = nameToken.accessorType + " "; + } + + return prefix + nameToken.value; +}; + +module.exports = NameStack; + +},{}],"/node_modules/jshint/src/options.js":[function(_dereq_,module,exports){ +"use strict"; +exports.bool = { + enforcing: { + bitwise : true, + freeze : true, + camelcase : true, + curly : true, + eqeqeq : true, + futurehostile: true, + notypeof : true, + es3 : true, + es5 : true, + forin : true, + funcscope : true, + immed : true, + iterator : true, + newcap : true, + noarg : true, + nocomma : true, + noempty : true, + nonbsp : true, + nonew : true, + undef : true, + singleGroups: false, + varstmt: false, + enforceall : false + }, + relaxing: { + asi : true, + multistr : true, + debug : true, + boss : true, + evil : true, + globalstrict: true, + plusplus : true, + proto : true, + scripturl : true, + sub : true, + supernew : true, + laxbreak : true, + laxcomma : true, + validthis : true, + withstmt : true, + moz : true, + noyield : true, + eqnull : true, + lastsemic : true, + loopfunc : true, + expr : true, + esnext : true, + elision : true, + }, + environments: { + mootools : true, + couch : true, + jasmine : true, + jquery : true, + node : true, + qunit : true, + rhino : true, + shelljs : true, + prototypejs : true, + yui : true, + mocha : true, + module : true, + wsh : true, + worker : true, + nonstandard : true, + browser : true, + browserify : true, + devel : true, + dojo : true, + typed : true, + phantom : true + }, + obsolete: { + onecase : true, // if one case switch statements should be allowed + regexp : true, // if the . should not be allowed in regexp literals + regexdash : true // if unescaped first/last dash (-) inside brackets + } +}; +exports.val = { + maxlen : false, + indent : false, + maxerr : false, + predef : false, + globals : false, + quotmark : false, + + scope : false, + maxstatements: false, + maxdepth : false, + maxparams : false, + maxcomplexity: false, + shadow : false, + strict : true, + unused : true, + latedef : false, + + ignore : false, // start/end ignoring lines of code, bypassing the lexer + + ignoreDelimiters: false, // array of start/end delimiters used to ignore + esversion: 5 +}; +exports.inverted = { + bitwise : true, + forin : true, + newcap : true, + plusplus: true, + regexp : true, + undef : true, + eqeqeq : true, + strict : true +}; + +exports.validNames = Object.keys(exports.val) + .concat(Object.keys(exports.bool.relaxing)) + .concat(Object.keys(exports.bool.enforcing)) + .concat(Object.keys(exports.bool.obsolete)) + .concat(Object.keys(exports.bool.environments)); +exports.renamed = { + eqeq : "eqeqeq", + windows: "wsh", + sloppy : "strict" +}; + +exports.removed = { + nomen: true, + onevar: true, + passfail: true, + white: true, + gcl: true, + smarttabs: true, + trailing: true +}; +exports.noenforceall = { + varstmt: true, + strict: true +}; + +},{}],"/node_modules/jshint/src/reg.js":[function(_dereq_,module,exports){ + +"use strict"; +exports.unsafeString = + /@cc|<\/?|script|\]\s*\]|<\s*!|</i; +exports.unsafeChars = + /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; +exports.needEsc = + /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; + +exports.needEscGlobal = + /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; +exports.starSlash = /\*\//; +exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; +exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i; +exports.fallsThrough = /^\s*falls?\sthrough\s*$/; +exports.maxlenException = /^(?:(?:\/\/|\/\*|\*) ?)?[^ ]+$/; + +},{}],"/node_modules/jshint/src/scope-manager.js":[function(_dereq_,module,exports){ +"use strict"; + +var _ = _dereq_("../lodash"); +var events = _dereq_("events"); +var marker = {}; +var scopeManager = function(state, predefined, exported, declared) { + + var _current; + var _scopeStack = []; + + function _newScope(type) { + _current = { + "(labels)": Object.create(null), + "(usages)": Object.create(null), + "(breakLabels)": Object.create(null), + "(parent)": _current, + "(type)": type, + "(params)": (type === "functionparams" || type === "catchparams") ? [] : null + }; + _scopeStack.push(_current); + } + + _newScope("global"); + _current["(predefined)"] = predefined; + + var _currentFunctBody = _current; // this is the block after the params = function + + var usedPredefinedAndGlobals = Object.create(null); + var impliedGlobals = Object.create(null); + var unuseds = []; + var emitter = new events.EventEmitter(); + + function warning(code, token) { + emitter.emit("warning", { + code: code, + token: token, + data: _.slice(arguments, 2) + }); + } + + function error(code, token) { + emitter.emit("warning", { + code: code, + token: token, + data: _.slice(arguments, 2) + }); + } + + function _setupUsages(labelName) { + if (!_current["(usages)"][labelName]) { + _current["(usages)"][labelName] = { + "(modified)": [], + "(reassigned)": [], + "(tokens)": [] + }; + } + } + + var _getUnusedOption = function(unused_opt) { + if (unused_opt === undefined) { + unused_opt = state.option.unused; + } + + if (unused_opt === true) { + unused_opt = "last-param"; + } + + return unused_opt; + }; + + var _warnUnused = function(name, tkn, type, unused_opt) { + var line = tkn.line; + var chr = tkn.from; + var raw_name = tkn.raw_text || name; + + unused_opt = _getUnusedOption(unused_opt); + + var warnable_types = { + "vars": ["var"], + "last-param": ["var", "param"], + "strict": ["var", "param", "last-param"] + }; + + if (unused_opt) { + if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) { + warning("W098", { line: line, from: chr }, raw_name); + } + } + if (unused_opt || type === "var") { + unuseds.push({ + name: name, + line: line, + character: chr + }); + } + }; + function _checkForUnused() { + if (_current["(type)"] === "functionparams") { + _checkParams(); + return; + } + var curentLabels = _current["(labels)"]; + for (var labelName in curentLabels) { + if (curentLabels[labelName]) { + if (curentLabels[labelName]["(type)"] !== "exception" && + curentLabels[labelName]["(unused)"]) { + _warnUnused(labelName, curentLabels[labelName]["(token)"], "var"); + } + } + } + } + function _checkParams() { + var params = _current["(params)"]; + + if (!params) { + return; + } + + var param = params.pop(); + var unused_opt; + + while (param) { + var label = _current["(labels)"][param]; + + unused_opt = _getUnusedOption(state.funct["(unusedOption)"]); + if (param === "undefined") + return; + + if (label["(unused)"]) { + _warnUnused(param, label["(token)"], "param", state.funct["(unusedOption)"]); + } else if (unused_opt === "last-param") { + return; + } + + param = params.pop(); + } + } + function _getLabel(labelName) { + for (var i = _scopeStack.length - 1 ; i >= 0; --i) { + var scopeLabels = _scopeStack[i]["(labels)"]; + if (scopeLabels[labelName]) { + return scopeLabels; + } + } + } + + function usedSoFarInCurrentFunction(labelName) { + for (var i = _scopeStack.length - 1; i >= 0; i--) { + var current = _scopeStack[i]; + if (current["(usages)"][labelName]) { + return current["(usages)"][labelName]; + } + if (current === _currentFunctBody) { + break; + } + } + return false; + } + + function _checkOuterShadow(labelName, token) { + if (state.option.shadow !== "outer") { + return; + } + + var isGlobal = _currentFunctBody["(type)"] === "global", + isNewFunction = _current["(type)"] === "functionparams"; + + var outsideCurrentFunction = !isGlobal; + for (var i = 0; i < _scopeStack.length; i++) { + var stackItem = _scopeStack[i]; + + if (!isNewFunction && _scopeStack[i + 1] === _currentFunctBody) { + outsideCurrentFunction = false; + } + if (outsideCurrentFunction && stackItem["(labels)"][labelName]) { + warning("W123", token, labelName); + } + if (stackItem["(breakLabels)"][labelName]) { + warning("W123", token, labelName); + } + } + } + + function _latedefWarning(type, labelName, token) { + if (state.option.latedef) { + if ((state.option.latedef === true && type === "function") || + type !== "function") { + warning("W003", token, labelName); + } + } + } + + var scopeManagerInst = { + + on: function(names, listener) { + names.split(" ").forEach(function(name) { + emitter.on(name, listener); + }); + }, + + isPredefined: function(labelName) { + return !this.has(labelName) && _.has(_scopeStack[0]["(predefined)"], labelName); + }, + stack: function(type) { + var previousScope = _current; + _newScope(type); + + if (!type && previousScope["(type)"] === "functionparams") { + + _current["(isFuncBody)"] = true; + _current["(context)"] = _currentFunctBody; + _currentFunctBody = _current; + } + }, + + unstack: function() { + var subScope = _scopeStack.length > 1 ? _scopeStack[_scopeStack.length - 2] : null; + var isUnstackingFunctionBody = _current === _currentFunctBody, + isUnstackingFunctionParams = _current["(type)"] === "functionparams", + isUnstackingFunctionOuter = _current["(type)"] === "functionouter"; + + var i, j; + var currentUsages = _current["(usages)"]; + var currentLabels = _current["(labels)"]; + var usedLabelNameList = Object.keys(currentUsages); + + if (currentUsages.__proto__ && usedLabelNameList.indexOf("__proto__") === -1) { + usedLabelNameList.push("__proto__"); + } + + for (i = 0; i < usedLabelNameList.length; i++) { + var usedLabelName = usedLabelNameList[i]; + + var usage = currentUsages[usedLabelName]; + var usedLabel = currentLabels[usedLabelName]; + if (usedLabel) { + var usedLabelType = usedLabel["(type)"]; + + if (usedLabel["(useOutsideOfScope)"] && !state.option.funcscope) { + var usedTokens = usage["(tokens)"]; + if (usedTokens) { + for (j = 0; j < usedTokens.length; j++) { + if (usedLabel["(function)"] === usedTokens[j]["(function)"]) { + error("W038", usedTokens[j], usedLabelName); + } + } + } + } + _current["(labels)"][usedLabelName]["(unused)"] = false; + if (usedLabelType === "const" && usage["(modified)"]) { + for (j = 0; j < usage["(modified)"].length; j++) { + error("E013", usage["(modified)"][j], usedLabelName); + } + } + if ((usedLabelType === "function" || usedLabelType === "class") && + usage["(reassigned)"]) { + for (j = 0; j < usage["(reassigned)"].length; j++) { + error("W021", usage["(reassigned)"][j], usedLabelName, usedLabelType); + } + } + continue; + } + + if (isUnstackingFunctionOuter) { + state.funct["(isCapturing)"] = true; + } + + if (subScope) { + if (!subScope["(usages)"][usedLabelName]) { + subScope["(usages)"][usedLabelName] = usage; + if (isUnstackingFunctionBody) { + subScope["(usages)"][usedLabelName]["(onlyUsedSubFunction)"] = true; + } + } else { + var subScopeUsage = subScope["(usages)"][usedLabelName]; + subScopeUsage["(modified)"] = subScopeUsage["(modified)"].concat(usage["(modified)"]); + subScopeUsage["(tokens)"] = subScopeUsage["(tokens)"].concat(usage["(tokens)"]); + subScopeUsage["(reassigned)"] = + subScopeUsage["(reassigned)"].concat(usage["(reassigned)"]); + subScopeUsage["(onlyUsedSubFunction)"] = false; + } + } else { + if (typeof _current["(predefined)"][usedLabelName] === "boolean") { + delete declared[usedLabelName]; + usedPredefinedAndGlobals[usedLabelName] = marker; + if (_current["(predefined)"][usedLabelName] === false && usage["(reassigned)"]) { + for (j = 0; j < usage["(reassigned)"].length; j++) { + warning("W020", usage["(reassigned)"][j]); + } + } + } + else { + if (usage["(tokens)"]) { + for (j = 0; j < usage["(tokens)"].length; j++) { + var undefinedToken = usage["(tokens)"][j]; + if (!undefinedToken.forgiveUndef) { + if (state.option.undef && !undefinedToken.ignoreUndef) { + warning("W117", undefinedToken, usedLabelName); + } + if (impliedGlobals[usedLabelName]) { + impliedGlobals[usedLabelName].line.push(undefinedToken.line); + } else { + impliedGlobals[usedLabelName] = { + name: usedLabelName, + line: [undefinedToken.line] + }; + } + } + } + } + } + } + } + if (!subScope) { + Object.keys(declared) + .forEach(function(labelNotUsed) { + _warnUnused(labelNotUsed, declared[labelNotUsed], "var"); + }); + } + if (subScope && !isUnstackingFunctionBody && + !isUnstackingFunctionParams && !isUnstackingFunctionOuter) { + var labelNames = Object.keys(currentLabels); + for (i = 0; i < labelNames.length; i++) { + + var defLabelName = labelNames[i]; + if (!currentLabels[defLabelName]["(blockscoped)"] && + currentLabels[defLabelName]["(type)"] !== "exception" && + !this.funct.has(defLabelName, { excludeCurrent: true })) { + subScope["(labels)"][defLabelName] = currentLabels[defLabelName]; + if (_currentFunctBody["(type)"] !== "global") { + subScope["(labels)"][defLabelName]["(useOutsideOfScope)"] = true; + } + delete currentLabels[defLabelName]; + } + } + } + + _checkForUnused(); + + _scopeStack.pop(); + if (isUnstackingFunctionBody) { + _currentFunctBody = _scopeStack[_.findLastIndex(_scopeStack, function(scope) { + return scope["(isFuncBody)"] || scope["(type)"] === "global"; + })]; + } + + _current = subScope; + }, + addParam: function(labelName, token, type) { + type = type || "param"; + + if (type === "exception") { + var previouslyDefinedLabelType = this.funct.labeltype(labelName); + if (previouslyDefinedLabelType && previouslyDefinedLabelType !== "exception") { + if (!state.option.node) { + warning("W002", state.tokens.next, labelName); + } + } + } + if (_.has(_current["(labels)"], labelName)) { + _current["(labels)"][labelName].duplicated = true; + } else { + _checkOuterShadow(labelName, token, type); + + _current["(labels)"][labelName] = { + "(type)" : type, + "(token)": token, + "(unused)": true }; + + _current["(params)"].push(labelName); + } + + if (_.has(_current["(usages)"], labelName)) { + var usage = _current["(usages)"][labelName]; + if (usage["(onlyUsedSubFunction)"]) { + _latedefWarning(type, labelName, token); + } else { + warning("E056", token, labelName, type); + } + } + }, + + validateParams: function() { + if (_currentFunctBody["(type)"] === "global") { + return; + } + + var isStrict = state.isStrict(); + var currentFunctParamScope = _currentFunctBody["(parent)"]; + + if (!currentFunctParamScope["(params)"]) { + return; + } + + currentFunctParamScope["(params)"].forEach(function(labelName) { + var label = currentFunctParamScope["(labels)"][labelName]; + + if (label && label.duplicated) { + if (isStrict) { + warning("E011", label["(token)"], labelName); + } else if (state.option.shadow !== true) { + warning("W004", label["(token)"], labelName); + } + } + }); + }, + + getUsedOrDefinedGlobals: function() { + var list = Object.keys(usedPredefinedAndGlobals); + if (usedPredefinedAndGlobals.__proto__ === marker && + list.indexOf("__proto__") === -1) { + list.push("__proto__"); + } + + return list; + }, + getImpliedGlobals: function() { + var values = _.values(impliedGlobals); + var hasProto = false; + if (impliedGlobals.__proto__) { + hasProto = values.some(function(value) { + return value.name === "__proto__"; + }); + + if (!hasProto) { + values.push(impliedGlobals.__proto__); + } + } + + return values; + }, + getUnuseds: function() { + return unuseds; + }, + + has: function(labelName) { + return Boolean(_getLabel(labelName)); + }, + + labeltype: function(labelName) { + var scopeLabels = _getLabel(labelName); + if (scopeLabels) { + return scopeLabels[labelName]["(type)"]; + } + return null; + }, + addExported: function(labelName) { + var globalLabels = _scopeStack[0]["(labels)"]; + if (_.has(declared, labelName)) { + delete declared[labelName]; + } else if (_.has(globalLabels, labelName)) { + globalLabels[labelName]["(unused)"] = false; + } else { + for (var i = 1; i < _scopeStack.length; i++) { + var scope = _scopeStack[i]; + if (!scope["(type)"]) { + if (_.has(scope["(labels)"], labelName) && + !scope["(labels)"][labelName]["(blockscoped)"]) { + scope["(labels)"][labelName]["(unused)"] = false; + return; + } + } else { + break; + } + } + exported[labelName] = true; + } + }, + setExported: function(labelName, token) { + this.block.use(labelName, token); + }, + addlabel: function(labelName, opts) { + + var type = opts.type; + var token = opts.token; + var isblockscoped = type === "let" || type === "const" || type === "class"; + var isexported = (isblockscoped ? _current : _currentFunctBody)["(type)"] === "global" && + _.has(exported, labelName); + _checkOuterShadow(labelName, token, type); + if (isblockscoped) { + + var declaredInCurrentScope = _current["(labels)"][labelName]; + if (!declaredInCurrentScope && _current === _currentFunctBody && + _current["(type)"] !== "global") { + declaredInCurrentScope = !!_currentFunctBody["(parent)"]["(labels)"][labelName]; + } + if (!declaredInCurrentScope && _current["(usages)"][labelName]) { + var usage = _current["(usages)"][labelName]; + if (usage["(onlyUsedSubFunction)"]) { + _latedefWarning(type, labelName, token); + } else { + warning("E056", token, labelName, type); + } + } + if (declaredInCurrentScope) { + warning("E011", token, labelName); + } + else if (state.option.shadow === "outer") { + if (scopeManagerInst.funct.has(labelName)) { + warning("W004", token, labelName); + } + } + + scopeManagerInst.block.add(labelName, type, token, !isexported); + + } else { + + var declaredInCurrentFunctionScope = scopeManagerInst.funct.has(labelName); + if (!declaredInCurrentFunctionScope && usedSoFarInCurrentFunction(labelName)) { + _latedefWarning(type, labelName, token); + } + if (scopeManagerInst.funct.has(labelName, { onlyBlockscoped: true })) { + warning("E011", token, labelName); + } else if (state.option.shadow !== true) { + if (declaredInCurrentFunctionScope && labelName !== "__proto__") { + if (_currentFunctBody["(type)"] !== "global") { + warning("W004", token, labelName); + } + } + } + + scopeManagerInst.funct.add(labelName, type, token, !isexported); + + if (_currentFunctBody["(type)"] === "global") { + usedPredefinedAndGlobals[labelName] = marker; + } + } + }, + + funct: { + labeltype: function(labelName, options) { + var onlyBlockscoped = options && options.onlyBlockscoped; + var excludeParams = options && options.excludeParams; + var currentScopeIndex = _scopeStack.length - (options && options.excludeCurrent ? 2 : 1); + for (var i = currentScopeIndex; i >= 0; i--) { + var current = _scopeStack[i]; + if (current["(labels)"][labelName] && + (!onlyBlockscoped || current["(labels)"][labelName]["(blockscoped)"])) { + return current["(labels)"][labelName]["(type)"]; + } + var scopeCheck = excludeParams ? _scopeStack[ i - 1 ] : current; + if (scopeCheck && scopeCheck["(type)"] === "functionparams") { + return null; + } + } + return null; + }, + hasBreakLabel: function(labelName) { + for (var i = _scopeStack.length - 1; i >= 0; i--) { + var current = _scopeStack[i]; + + if (current["(breakLabels)"][labelName]) { + return true; + } + if (current["(type)"] === "functionparams") { + return false; + } + } + return false; + }, + has: function(labelName, options) { + return Boolean(this.labeltype(labelName, options)); + }, + add: function(labelName, type, tok, unused) { + _current["(labels)"][labelName] = { + "(type)" : type, + "(token)": tok, + "(blockscoped)": false, + "(function)": _currentFunctBody, + "(unused)": unused }; + } + }, + + block: { + isGlobal: function() { + return _current["(type)"] === "global"; + }, + + use: function(labelName, token) { + var paramScope = _currentFunctBody["(parent)"]; + if (paramScope && paramScope["(labels)"][labelName] && + paramScope["(labels)"][labelName]["(type)"] === "param") { + if (!scopeManagerInst.funct.has(labelName, + { excludeParams: true, onlyBlockscoped: true })) { + paramScope["(labels)"][labelName]["(unused)"] = false; + } + } + + if (token && (state.ignored.W117 || state.option.undef === false)) { + token.ignoreUndef = true; + } + + _setupUsages(labelName); + + if (token) { + token["(function)"] = _currentFunctBody; + _current["(usages)"][labelName]["(tokens)"].push(token); + } + }, + + reassign: function(labelName, token) { + + this.modify(labelName, token); + + _current["(usages)"][labelName]["(reassigned)"].push(token); + }, + + modify: function(labelName, token) { + + _setupUsages(labelName); + + _current["(usages)"][labelName]["(modified)"].push(token); + }, + add: function(labelName, type, tok, unused) { + _current["(labels)"][labelName] = { + "(type)" : type, + "(token)": tok, + "(blockscoped)": true, + "(unused)": unused }; + }, + + addBreakLabel: function(labelName, opts) { + var token = opts.token; + if (scopeManagerInst.funct.hasBreakLabel(labelName)) { + warning("E011", token, labelName); + } + else if (state.option.shadow === "outer") { + if (scopeManagerInst.funct.has(labelName)) { + warning("W004", token, labelName); + } else { + _checkOuterShadow(labelName, token); + } + } + _current["(breakLabels)"][labelName] = token; + } + } + }; + return scopeManagerInst; +}; + +module.exports = scopeManager; + +},{"../lodash":"/node_modules/jshint/lodash.js","events":"/node_modules/browserify/node_modules/events/events.js"}],"/node_modules/jshint/src/state.js":[function(_dereq_,module,exports){ +"use strict"; +var NameStack = _dereq_("./name-stack.js"); + +var state = { + syntax: {}, + isStrict: function() { + return this.directive["use strict"] || this.inClassBody || + this.option.module || this.option.strict === "implied"; + }, + + inMoz: function() { + return this.option.moz; + }, + inES6: function() { + return this.option.moz || this.option.esversion >= 6; + }, + inES5: function(strict) { + if (strict) { + return (!this.option.esversion || this.option.esversion === 5) && !this.option.moz; + } + return !this.option.esversion || this.option.esversion >= 5 || this.option.moz; + }, + + + reset: function() { + this.tokens = { + prev: null, + next: null, + curr: null + }; + + this.option = {}; + this.funct = null; + this.ignored = {}; + this.directive = {}; + this.jsonMode = false; + this.jsonWarnings = []; + this.lines = []; + this.tab = ""; + this.cache = {}; // Node.JS doesn't have Map. Sniff. + this.ignoredLines = {}; + this.forinifcheckneeded = false; + this.nameStack = new NameStack(); + this.inClassBody = false; + } +}; + +exports.state = state; + +},{"./name-stack.js":"/node_modules/jshint/src/name-stack.js"}],"/node_modules/jshint/src/style.js":[function(_dereq_,module,exports){ +"use strict"; + +exports.register = function(linter) { + + linter.on("Identifier", function style_scanProto(data) { + if (linter.getOption("proto")) { + return; + } + + if (data.name === "__proto__") { + linter.warn("W103", { + line: data.line, + char: data.char, + data: [ data.name, "6" ] + }); + } + }); + + linter.on("Identifier", function style_scanIterator(data) { + if (linter.getOption("iterator")) { + return; + } + + if (data.name === "__iterator__") { + linter.warn("W103", { + line: data.line, + char: data.char, + data: [ data.name ] + }); + } + }); + + linter.on("Identifier", function style_scanCamelCase(data) { + if (!linter.getOption("camelcase")) { + return; + } + + if (data.name.replace(/^_+|_+$/g, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) { + linter.warn("W106", { + line: data.line, + char: data.from, + data: [ data.name ] + }); + } + }); + + linter.on("String", function style_scanQuotes(data) { + var quotmark = linter.getOption("quotmark"); + var code; + + if (!quotmark) { + return; + } + + if (quotmark === "single" && data.quote !== "'") { + code = "W109"; + } + + if (quotmark === "double" && data.quote !== "\"") { + code = "W108"; + } + + if (quotmark === true) { + if (!linter.getCache("quotmark")) { + linter.setCache("quotmark", data.quote); + } + + if (linter.getCache("quotmark") !== data.quote) { + code = "W110"; + } + } + + if (code) { + linter.warn(code, { + line: data.line, + char: data.char, + }); + } + }); + + linter.on("Number", function style_scanNumbers(data) { + if (data.value.charAt(0) === ".") { + linter.warn("W008", { + line: data.line, + char: data.char, + data: [ data.value ] + }); + } + + if (data.value.substr(data.value.length - 1) === ".") { + linter.warn("W047", { + line: data.line, + char: data.char, + data: [ data.value ] + }); + } + + if (/^00+/.test(data.value)) { + linter.warn("W046", { + line: data.line, + char: data.char, + data: [ data.value ] + }); + } + }); + + linter.on("String", function style_scanJavaScriptURLs(data) { + var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\s*:/i; + + if (linter.getOption("scripturl")) { + return; + } + + if (re.test(data.value)) { + linter.warn("W107", { + line: data.line, + char: data.char + }); + } + }); +}; + +},{}],"/node_modules/jshint/src/vars.js":[function(_dereq_,module,exports){ + +"use strict"; + +exports.reservedVars = { + arguments : false, + NaN : false +}; + +exports.ecmaIdentifiers = { + 3: { + Array : false, + Boolean : false, + Date : false, + decodeURI : false, + decodeURIComponent : false, + encodeURI : false, + encodeURIComponent : false, + Error : false, + "eval" : false, + EvalError : false, + Function : false, + hasOwnProperty : false, + isFinite : false, + isNaN : false, + Math : false, + Number : false, + Object : false, + parseInt : false, + parseFloat : false, + RangeError : false, + ReferenceError : false, + RegExp : false, + String : false, + SyntaxError : false, + TypeError : false, + URIError : false + }, + 5: { + JSON : false + }, + 6: { + Map : false, + Promise : false, + Proxy : false, + Reflect : false, + Set : false, + Symbol : false, + WeakMap : false, + WeakSet : false + } +}; + +exports.browser = { + Audio : false, + Blob : false, + addEventListener : false, + applicationCache : false, + atob : false, + blur : false, + btoa : false, + cancelAnimationFrame : false, + CanvasGradient : false, + CanvasPattern : false, + CanvasRenderingContext2D: false, + CSS : false, + clearInterval : false, + clearTimeout : false, + close : false, + closed : false, + Comment : false, + CustomEvent : false, + DOMParser : false, + defaultStatus : false, + Document : false, + document : false, + DocumentFragment : false, + Element : false, + ElementTimeControl : false, + Event : false, + event : false, + fetch : false, + FileReader : false, + FormData : false, + focus : false, + frames : false, + getComputedStyle : false, + HTMLElement : false, + HTMLAnchorElement : false, + HTMLBaseElement : false, + HTMLBlockquoteElement: false, + HTMLBodyElement : false, + HTMLBRElement : false, + HTMLButtonElement : false, + HTMLCanvasElement : false, + HTMLCollection : false, + HTMLDirectoryElement : false, + HTMLDivElement : false, + HTMLDListElement : false, + HTMLFieldSetElement : false, + HTMLFontElement : false, + HTMLFormElement : false, + HTMLFrameElement : false, + HTMLFrameSetElement : false, + HTMLHeadElement : false, + HTMLHeadingElement : false, + HTMLHRElement : false, + HTMLHtmlElement : false, + HTMLIFrameElement : false, + HTMLImageElement : false, + HTMLInputElement : false, + HTMLIsIndexElement : false, + HTMLLabelElement : false, + HTMLLayerElement : false, + HTMLLegendElement : false, + HTMLLIElement : false, + HTMLLinkElement : false, + HTMLMapElement : false, + HTMLMenuElement : false, + HTMLMetaElement : false, + HTMLModElement : false, + HTMLObjectElement : false, + HTMLOListElement : false, + HTMLOptGroupElement : false, + HTMLOptionElement : false, + HTMLParagraphElement : false, + HTMLParamElement : false, + HTMLPreElement : false, + HTMLQuoteElement : false, + HTMLScriptElement : false, + HTMLSelectElement : false, + HTMLStyleElement : false, + HTMLTableCaptionElement: false, + HTMLTableCellElement : false, + HTMLTableColElement : false, + HTMLTableElement : false, + HTMLTableRowElement : false, + HTMLTableSectionElement: false, + HTMLTemplateElement : false, + HTMLTextAreaElement : false, + HTMLTitleElement : false, + HTMLUListElement : false, + HTMLVideoElement : false, + history : false, + Image : false, + Intl : false, + length : false, + localStorage : false, + location : false, + matchMedia : false, + MessageChannel : false, + MessageEvent : false, + MessagePort : false, + MouseEvent : false, + moveBy : false, + moveTo : false, + MutationObserver : false, + name : false, + Node : false, + NodeFilter : false, + NodeList : false, + Notification : false, + navigator : false, + onbeforeunload : true, + onblur : true, + onerror : true, + onfocus : true, + onload : true, + onresize : true, + onunload : true, + open : false, + openDatabase : false, + opener : false, + Option : false, + parent : false, + performance : false, + print : false, + Range : false, + requestAnimationFrame : false, + removeEventListener : false, + resizeBy : false, + resizeTo : false, + screen : false, + scroll : false, + scrollBy : false, + scrollTo : false, + sessionStorage : false, + setInterval : false, + setTimeout : false, + SharedWorker : false, + status : false, + SVGAElement : false, + SVGAltGlyphDefElement: false, + SVGAltGlyphElement : false, + SVGAltGlyphItemElement: false, + SVGAngle : false, + SVGAnimateColorElement: false, + SVGAnimateElement : false, + SVGAnimateMotionElement: false, + SVGAnimateTransformElement: false, + SVGAnimatedAngle : false, + SVGAnimatedBoolean : false, + SVGAnimatedEnumeration: false, + SVGAnimatedInteger : false, + SVGAnimatedLength : false, + SVGAnimatedLengthList: false, + SVGAnimatedNumber : false, + SVGAnimatedNumberList: false, + SVGAnimatedPathData : false, + SVGAnimatedPoints : false, + SVGAnimatedPreserveAspectRatio: false, + SVGAnimatedRect : false, + SVGAnimatedString : false, + SVGAnimatedTransformList: false, + SVGAnimationElement : false, + SVGCSSRule : false, + SVGCircleElement : false, + SVGClipPathElement : false, + SVGColor : false, + SVGColorProfileElement: false, + SVGColorProfileRule : false, + SVGComponentTransferFunctionElement: false, + SVGCursorElement : false, + SVGDefsElement : false, + SVGDescElement : false, + SVGDocument : false, + SVGElement : false, + SVGElementInstance : false, + SVGElementInstanceList: false, + SVGEllipseElement : false, + SVGExternalResourcesRequired: false, + SVGFEBlendElement : false, + SVGFEColorMatrixElement: false, + SVGFEComponentTransferElement: false, + SVGFECompositeElement: false, + SVGFEConvolveMatrixElement: false, + SVGFEDiffuseLightingElement: false, + SVGFEDisplacementMapElement: false, + SVGFEDistantLightElement: false, + SVGFEFloodElement : false, + SVGFEFuncAElement : false, + SVGFEFuncBElement : false, + SVGFEFuncGElement : false, + SVGFEFuncRElement : false, + SVGFEGaussianBlurElement: false, + SVGFEImageElement : false, + SVGFEMergeElement : false, + SVGFEMergeNodeElement: false, + SVGFEMorphologyElement: false, + SVGFEOffsetElement : false, + SVGFEPointLightElement: false, + SVGFESpecularLightingElement: false, + SVGFESpotLightElement: false, + SVGFETileElement : false, + SVGFETurbulenceElement: false, + SVGFilterElement : false, + SVGFilterPrimitiveStandardAttributes: false, + SVGFitToViewBox : false, + SVGFontElement : false, + SVGFontFaceElement : false, + SVGFontFaceFormatElement: false, + SVGFontFaceNameElement: false, + SVGFontFaceSrcElement: false, + SVGFontFaceUriElement: false, + SVGForeignObjectElement: false, + SVGGElement : false, + SVGGlyphElement : false, + SVGGlyphRefElement : false, + SVGGradientElement : false, + SVGHKernElement : false, + SVGICCColor : false, + SVGImageElement : false, + SVGLangSpace : false, + SVGLength : false, + SVGLengthList : false, + SVGLineElement : false, + SVGLinearGradientElement: false, + SVGLocatable : false, + SVGMPathElement : false, + SVGMarkerElement : false, + SVGMaskElement : false, + SVGMatrix : false, + SVGMetadataElement : false, + SVGMissingGlyphElement: false, + SVGNumber : false, + SVGNumberList : false, + SVGPaint : false, + SVGPathElement : false, + SVGPathSeg : false, + SVGPathSegArcAbs : false, + SVGPathSegArcRel : false, + SVGPathSegClosePath : false, + SVGPathSegCurvetoCubicAbs: false, + SVGPathSegCurvetoCubicRel: false, + SVGPathSegCurvetoCubicSmoothAbs: false, + SVGPathSegCurvetoCubicSmoothRel: false, + SVGPathSegCurvetoQuadraticAbs: false, + SVGPathSegCurvetoQuadraticRel: false, + SVGPathSegCurvetoQuadraticSmoothAbs: false, + SVGPathSegCurvetoQuadraticSmoothRel: false, + SVGPathSegLinetoAbs : false, + SVGPathSegLinetoHorizontalAbs: false, + SVGPathSegLinetoHorizontalRel: false, + SVGPathSegLinetoRel : false, + SVGPathSegLinetoVerticalAbs: false, + SVGPathSegLinetoVerticalRel: false, + SVGPathSegList : false, + SVGPathSegMovetoAbs : false, + SVGPathSegMovetoRel : false, + SVGPatternElement : false, + SVGPoint : false, + SVGPointList : false, + SVGPolygonElement : false, + SVGPolylineElement : false, + SVGPreserveAspectRatio: false, + SVGRadialGradientElement: false, + SVGRect : false, + SVGRectElement : false, + SVGRenderingIntent : false, + SVGSVGElement : false, + SVGScriptElement : false, + SVGSetElement : false, + SVGStopElement : false, + SVGStringList : false, + SVGStylable : false, + SVGStyleElement : false, + SVGSwitchElement : false, + SVGSymbolElement : false, + SVGTRefElement : false, + SVGTSpanElement : false, + SVGTests : false, + SVGTextContentElement: false, + SVGTextElement : false, + SVGTextPathElement : false, + SVGTextPositioningElement: false, + SVGTitleElement : false, + SVGTransform : false, + SVGTransformList : false, + SVGTransformable : false, + SVGURIReference : false, + SVGUnitTypes : false, + SVGUseElement : false, + SVGVKernElement : false, + SVGViewElement : false, + SVGViewSpec : false, + SVGZoomAndPan : false, + Text : false, + TextDecoder : false, + TextEncoder : false, + TimeEvent : false, + top : false, + URL : false, + WebGLActiveInfo : false, + WebGLBuffer : false, + WebGLContextEvent : false, + WebGLFramebuffer : false, + WebGLProgram : false, + WebGLRenderbuffer : false, + WebGLRenderingContext: false, + WebGLShader : false, + WebGLShaderPrecisionFormat: false, + WebGLTexture : false, + WebGLUniformLocation : false, + WebSocket : false, + window : false, + Window : false, + Worker : false, + XDomainRequest : false, + XMLHttpRequest : false, + XMLSerializer : false, + XPathEvaluator : false, + XPathException : false, + XPathExpression : false, + XPathNamespace : false, + XPathNSResolver : false, + XPathResult : false +}; + +exports.devel = { + alert : false, + confirm: false, + console: false, + Debug : false, + opera : false, + prompt : false +}; + +exports.worker = { + importScripts : true, + postMessage : true, + self : true, + FileReaderSync : true +}; +exports.nonstandard = { + escape : false, + unescape: false +}; + +exports.couch = { + "require" : false, + respond : false, + getRow : false, + emit : false, + send : false, + start : false, + sum : false, + log : false, + exports : false, + module : false, + provides : false +}; + +exports.node = { + __filename : false, + __dirname : false, + GLOBAL : false, + global : false, + module : false, + require : false, + + Buffer : true, + console : true, + exports : true, + process : true, + setTimeout : true, + clearTimeout : true, + setInterval : true, + clearInterval : true, + setImmediate : true, // v0.9.1+ + clearImmediate: true // v0.9.1+ +}; + +exports.browserify = { + __filename : false, + __dirname : false, + global : false, + module : false, + require : false, + Buffer : true, + exports : true, + process : true +}; + +exports.phantom = { + phantom : true, + require : true, + WebPage : true, + console : true, // in examples, but undocumented + exports : true // v1.7+ +}; + +exports.qunit = { + asyncTest : false, + deepEqual : false, + equal : false, + expect : false, + module : false, + notDeepEqual : false, + notEqual : false, + notPropEqual : false, + notStrictEqual : false, + ok : false, + propEqual : false, + QUnit : false, + raises : false, + start : false, + stop : false, + strictEqual : false, + test : false, + "throws" : false +}; + +exports.rhino = { + defineClass : false, + deserialize : false, + gc : false, + help : false, + importClass : false, + importPackage: false, + "java" : false, + load : false, + loadClass : false, + Packages : false, + print : false, + quit : false, + readFile : false, + readUrl : false, + runCommand : false, + seal : false, + serialize : false, + spawn : false, + sync : false, + toint32 : false, + version : false +}; + +exports.shelljs = { + target : false, + echo : false, + exit : false, + cd : false, + pwd : false, + ls : false, + find : false, + cp : false, + rm : false, + mv : false, + mkdir : false, + test : false, + cat : false, + sed : false, + grep : false, + which : false, + dirs : false, + pushd : false, + popd : false, + env : false, + exec : false, + chmod : false, + config : false, + error : false, + tempdir : false +}; + +exports.typed = { + ArrayBuffer : false, + ArrayBufferView : false, + DataView : false, + Float32Array : false, + Float64Array : false, + Int16Array : false, + Int32Array : false, + Int8Array : false, + Uint16Array : false, + Uint32Array : false, + Uint8Array : false, + Uint8ClampedArray : false +}; + +exports.wsh = { + ActiveXObject : true, + Enumerator : true, + GetObject : true, + ScriptEngine : true, + ScriptEngineBuildVersion : true, + ScriptEngineMajorVersion : true, + ScriptEngineMinorVersion : true, + VBArray : true, + WSH : true, + WScript : true, + XDomainRequest : true +}; + +exports.dojo = { + dojo : false, + dijit : false, + dojox : false, + define : false, + "require": false +}; + +exports.jquery = { + "$" : false, + jQuery : false +}; + +exports.mootools = { + "$" : false, + "$$" : false, + Asset : false, + Browser : false, + Chain : false, + Class : false, + Color : false, + Cookie : false, + Core : false, + Document : false, + DomReady : false, + DOMEvent : false, + DOMReady : false, + Drag : false, + Element : false, + Elements : false, + Event : false, + Events : false, + Fx : false, + Group : false, + Hash : false, + HtmlTable : false, + IFrame : false, + IframeShim : false, + InputValidator: false, + instanceOf : false, + Keyboard : false, + Locale : false, + Mask : false, + MooTools : false, + Native : false, + Options : false, + OverText : false, + Request : false, + Scroller : false, + Slick : false, + Slider : false, + Sortables : false, + Spinner : false, + Swiff : false, + Tips : false, + Type : false, + typeOf : false, + URI : false, + Window : false +}; + +exports.prototypejs = { + "$" : false, + "$$" : false, + "$A" : false, + "$F" : false, + "$H" : false, + "$R" : false, + "$break" : false, + "$continue" : false, + "$w" : false, + Abstract : false, + Ajax : false, + Class : false, + Enumerable : false, + Element : false, + Event : false, + Field : false, + Form : false, + Hash : false, + Insertion : false, + ObjectRange : false, + PeriodicalExecuter: false, + Position : false, + Prototype : false, + Selector : false, + Template : false, + Toggle : false, + Try : false, + Autocompleter : false, + Builder : false, + Control : false, + Draggable : false, + Draggables : false, + Droppables : false, + Effect : false, + Sortable : false, + SortableObserver : false, + Sound : false, + Scriptaculous : false +}; + +exports.yui = { + YUI : false, + Y : false, + YUI_config: false +}; + +exports.mocha = { + mocha : false, + describe : false, + xdescribe : false, + it : false, + xit : false, + context : false, + xcontext : false, + before : false, + after : false, + beforeEach : false, + afterEach : false, + suite : false, + test : false, + setup : false, + teardown : false, + suiteSetup : false, + suiteTeardown : false +}; + +exports.jasmine = { + jasmine : false, + describe : false, + xdescribe : false, + it : false, + xit : false, + beforeEach : false, + afterEach : false, + setFixtures : false, + loadFixtures: false, + spyOn : false, + expect : false, + runs : false, + waitsFor : false, + waits : false, + beforeAll : false, + afterAll : false, + fail : false, + fdescribe : false, + fit : false, + pending : false +}; + +},{}]},{},["/node_modules/jshint/src/jshint.js"]); + +}); + +ace.define("ace/mode/javascript_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/javascript/jshint"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var lint = require("./javascript/jshint").JSHINT; + +function startRegex(arr) { + return RegExp("^(" + arr.join("|") + ")"); +} + +var disabledWarningsRe = startRegex([ + "Bad for in variable '(.+)'.", + 'Missing "use strict"' +]); +var errorsRe = startRegex([ + "Unexpected", + "Expected ", + "Confusing (plus|minus)", + "\\{a\\} unterminated regular expression", + "Unclosed ", + "Unmatched ", + "Unbegun comment", + "Bad invocation", + "Missing space after", + "Missing operator at" +]); +var infoRe = startRegex([ + "Expected an assignment", + "Bad escapement of EOL", + "Unexpected comma", + "Unexpected space", + "Missing radix parameter.", + "A leading decimal point can", + "\\['{a}'\\] is better written in dot notation.", + "'{a}' used out of scope" +]); + +var JavaScriptWorker = exports.JavaScriptWorker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(500); + this.setOptions(); +}; + +oop.inherits(JavaScriptWorker, Mirror); + +(function() { + this.setOptions = function(options) { + this.options = options || { + esnext: true, + moz: true, + devel: true, + browser: true, + node: true, + laxcomma: true, + laxbreak: true, + lastsemic: true, + onevar: false, + passfail: false, + maxerr: 100, + expr: true, + multistr: true, + globalstrict: true + }; + this.doc.getValue() && this.deferredUpdate.schedule(100); + }; + + this.changeOptions = function(newOptions) { + oop.mixin(this.options, newOptions); + this.doc.getValue() && this.deferredUpdate.schedule(100); + }; + + this.isValidJS = function(str) { + try { + eval("throw 0;" + str); + } catch(e) { + if (e === 0) + return true; + } + return false + }; + + this.onUpdate = function() { + var value = this.doc.getValue(); + value = value.replace(/^#!.*\n/, "\n"); + if (!value) + return this.sender.emit("annotate", []); + + var errors = []; + var maxErrorLevel = this.isValidJS(value) ? "warning" : "error"; + lint(value, this.options); + var results = lint.errors; + + var errorAdded = false + for (var i = 0; i < results.length; i++) { + var error = results[i]; + if (!error) + continue; + var raw = error.raw; + var type = "warning"; + + if (raw == "Missing semicolon.") { + var str = error.evidence.substr(error.character); + str = str.charAt(str.search(/\S/)); + if (maxErrorLevel == "error" && str && /[\w\d{(['"]/.test(str)) { + error.reason = 'Missing ";" before statement'; + type = "error"; + } else { + type = "info"; + } + } + else if (disabledWarningsRe.test(raw)) { + continue; + } + else if (infoRe.test(raw)) { + type = "info" + } + else if (errorsRe.test(raw)) { + errorAdded = true; + type = maxErrorLevel; + } + else if (raw == "'{a}' is not defined.") { + type = "warning"; + } + else if (raw == "'{a}' is defined but never used.") { + type = "info"; + } + + errors.push({ + row: error.line-1, + column: error.character-1, + text: error.reason, + type: type, + raw: raw + }); + + if (errorAdded) { + } + } + + this.sender.emit("annotate", errors); + }; + +}).call(JavaScriptWorker.prototype); + +}); + +ace.define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { + +function Empty() {} + +if (!Function.prototype.bind) { + Function.prototype.bind = function bind(that) { // .length is 1 + var target = this; + if (typeof target != "function") { + throw new TypeError("Function.prototype.bind called on incompatible " + target); + } + var args = slice.call(arguments, 1); // for normal call + var bound = function () { + + if (this instanceof bound) { + + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + + } + + }; + if(target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + return bound; + }; +} +var call = Function.prototype.call; +var prototypeOfArray = Array.prototype; +var prototypeOfObject = Object.prototype; +var slice = prototypeOfArray.slice; +var _toString = call.bind(prototypeOfObject.toString); +var owns = call.bind(prototypeOfObject.hasOwnProperty); +var defineGetter; +var defineSetter; +var lookupGetter; +var lookupSetter; +var supportsAccessors; +if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { + defineGetter = call.bind(prototypeOfObject.__defineGetter__); + defineSetter = call.bind(prototypeOfObject.__defineSetter__); + lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); + lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); +} +if ([1,2].splice(0).length != 2) { + if(function() { // test IE < 9 to splice bug - see issue #138 + function makeArray(l) { + var a = new Array(l+2); + a[0] = a[1] = 0; + return a; + } + var array = [], lengthBefore; + + array.splice.apply(array, makeArray(20)); + array.splice.apply(array, makeArray(26)); + + lengthBefore = array.length; //46 + array.splice(5, 0, "XXX"); // add one element + + lengthBefore + 1 == array.length + + if (lengthBefore + 1 == array.length) { + return true;// has right splice implementation without bugs + } + }()) {//IE 6/7 + var array_splice = Array.prototype.splice; + Array.prototype.splice = function(start, deleteCount) { + if (!arguments.length) { + return []; + } else { + return array_splice.apply(this, [ + start === void 0 ? 0 : start, + deleteCount === void 0 ? (this.length - start) : deleteCount + ].concat(slice.call(arguments, 2))) + } + }; + } else {//IE8 + Array.prototype.splice = function(pos, removeCount){ + var length = this.length; + if (pos > 0) { + if (pos > length) + pos = length; + } else if (pos == void 0) { + pos = 0; + } else if (pos < 0) { + pos = Math.max(length + pos, 0); + } + + if (!(pos+removeCount < length)) + removeCount = length - pos; + + var removed = this.slice(pos, pos+removeCount); + var insert = slice.call(arguments, 2); + var add = insert.length; + if (pos === length) { + if (add) { + this.push.apply(this, insert); + } + } else { + var remove = Math.min(removeCount, length - pos); + var tailOldPos = pos + remove; + var tailNewPos = tailOldPos + add - remove; + var tailCount = length - tailOldPos; + var lengthAfterRemove = length - remove; + + if (tailNewPos < tailOldPos) { // case A + for (var i = 0; i < tailCount; ++i) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } else if (tailNewPos > tailOldPos) { // case B + for (i = tailCount; i--; ) { + this[tailNewPos+i] = this[tailOldPos+i]; + } + } // else, add == remove (nothing to do) + + if (add && pos === lengthAfterRemove) { + this.length = lengthAfterRemove; // truncate array + this.push.apply(this, insert); + } else { + this.length = lengthAfterRemove + add; // reserves space + for (i = 0; i < add; ++i) { + this[pos+i] = insert[i]; + } + } + } + return removed; + }; + } +} +if (!Array.isArray) { + Array.isArray = function isArray(obj) { + return _toString(obj) == "[object Array]"; + }; +} +var boxedString = Object("a"), + splitString = boxedString[0] != "a" || !(0 in boxedString); + +if (!Array.prototype.forEach) { + Array.prototype.forEach = function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + fun.call(thisp, self[i], i, object); + } + } + }; +} +if (!Array.prototype.map) { + Array.prototype.map = function map(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = Array(length), + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) + result[i] = fun.call(thisp, self[i], i, object); + } + return result; + }; +} +if (!Array.prototype.filter) { + Array.prototype.filter = function filter(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + result = [], + value, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self) { + value = self[i]; + if (fun.call(thisp, value, i, object)) { + result.push(value); + } + } + } + return result; + }; +} +if (!Array.prototype.every) { + Array.prototype.every = function every(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && !fun.call(thisp, self[i], i, object)) { + return false; + } + } + return true; + }; +} +if (!Array.prototype.some) { + Array.prototype.some = function some(fun /*, thisp */) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0, + thisp = arguments[1]; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + + for (var i = 0; i < length; i++) { + if (i in self && fun.call(thisp, self[i], i, object)) { + return true; + } + } + return false; + }; +} +if (!Array.prototype.reduce) { + Array.prototype.reduce = function reduce(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduce of empty array with no initial value"); + } + + var i = 0; + var result; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i++]; + break; + } + if (++i >= length) { + throw new TypeError("reduce of empty array with no initial value"); + } + } while (true); + } + + for (; i < length; i++) { + if (i in self) { + result = fun.call(void 0, result, self[i], i, object); + } + } + + return result; + }; +} +if (!Array.prototype.reduceRight) { + Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + var object = toObject(this), + self = splitString && _toString(this) == "[object String]" ? + this.split("") : + object, + length = self.length >>> 0; + if (_toString(fun) != "[object Function]") { + throw new TypeError(fun + " is not a function"); + } + if (!length && arguments.length == 1) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + + var result, i = length - 1; + if (arguments.length >= 2) { + result = arguments[1]; + } else { + do { + if (i in self) { + result = self[i--]; + break; + } + if (--i < 0) { + throw new TypeError("reduceRight of empty array with no initial value"); + } + } while (true); + } + + do { + if (i in this) { + result = fun.call(void 0, result, self[i], i, object); + } + } while (i--); + + return result; + }; +} +if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) { + Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + }; +} +if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) { + Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && _toString(this) == "[object String]" ? + this.split("") : + toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + var i = length - 1; + if (arguments.length > 1) { + i = Math.min(i, toInteger(arguments[1])); + } + i = i >= 0 ? i : length - Math.abs(i); + for (; i >= 0; i--) { + if (i in self && sought === self[i]) { + return i; + } + } + return -1; + }; +} +if (!Object.getPrototypeOf) { + Object.getPrototypeOf = function getPrototypeOf(object) { + return object.__proto__ || ( + object.constructor ? + object.constructor.prototype : + prototypeOfObject + ); + }; +} +if (!Object.getOwnPropertyDescriptor) { + var ERR_NON_OBJECT = "Object.getOwnPropertyDescriptor called on a " + + "non-object: "; + Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT + object); + if (!owns(object, property)) + return; + + var descriptor, getter, setter; + descriptor = { enumerable: true, configurable: true }; + if (supportsAccessors) { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + + var getter = lookupGetter(object, property); + var setter = lookupSetter(object, property); + object.__proto__ = prototype; + + if (getter || setter) { + if (getter) descriptor.get = getter; + if (setter) descriptor.set = setter; + return descriptor; + } + } + descriptor.value = object[property]; + return descriptor; + }; +} +if (!Object.getOwnPropertyNames) { + Object.getOwnPropertyNames = function getOwnPropertyNames(object) { + return Object.keys(object); + }; +} +if (!Object.create) { + var createEmpty; + if (Object.prototype.__proto__ === null) { + createEmpty = function () { + return { "__proto__": null }; + }; + } else { + createEmpty = function () { + var empty = {}; + for (var i in empty) + empty[i] = null; + empty.constructor = + empty.hasOwnProperty = + empty.propertyIsEnumerable = + empty.isPrototypeOf = + empty.toLocaleString = + empty.toString = + empty.valueOf = + empty.__proto__ = null; + return empty; + } + } + + Object.create = function create(prototype, properties) { + var object; + if (prototype === null) { + object = createEmpty(); + } else { + if (typeof prototype != "object") + throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'"); + var Type = function () {}; + Type.prototype = prototype; + object = new Type(); + object.__proto__ = prototype; + } + if (properties !== void 0) + Object.defineProperties(object, properties); + return object; + }; +} + +function doesDefinePropertyWork(object) { + try { + Object.defineProperty(object, "sentinel", {}); + return "sentinel" in object; + } catch (exception) { + } +} +if (Object.defineProperty) { + var definePropertyWorksOnObject = doesDefinePropertyWork({}); + var definePropertyWorksOnDom = typeof document == "undefined" || + doesDefinePropertyWork(document.createElement("div")); + if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) { + var definePropertyFallback = Object.defineProperty; + } +} + +if (!Object.defineProperty || definePropertyFallback) { + var ERR_NON_OBJECT_DESCRIPTOR = "Property description must be an object: "; + var ERR_NON_OBJECT_TARGET = "Object.defineProperty called on non-object: " + var ERR_ACCESSORS_NOT_SUPPORTED = "getters & setters can not be defined " + + "on this javascript engine"; + + Object.defineProperty = function defineProperty(object, property, descriptor) { + if ((typeof object != "object" && typeof object != "function") || object === null) + throw new TypeError(ERR_NON_OBJECT_TARGET + object); + if ((typeof descriptor != "object" && typeof descriptor != "function") || descriptor === null) + throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor); + if (definePropertyFallback) { + try { + return definePropertyFallback.call(Object, object, property, descriptor); + } catch (exception) { + } + } + if (owns(descriptor, "value")) { + + if (supportsAccessors && (lookupGetter(object, property) || + lookupSetter(object, property))) + { + var prototype = object.__proto__; + object.__proto__ = prototypeOfObject; + delete object[property]; + object[property] = descriptor.value; + object.__proto__ = prototype; + } else { + object[property] = descriptor.value; + } + } else { + if (!supportsAccessors) + throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED); + if (owns(descriptor, "get")) + defineGetter(object, property, descriptor.get); + if (owns(descriptor, "set")) + defineSetter(object, property, descriptor.set); + } + + return object; + }; +} +if (!Object.defineProperties) { + Object.defineProperties = function defineProperties(object, properties) { + for (var property in properties) { + if (owns(properties, property)) + Object.defineProperty(object, property, properties[property]); + } + return object; + }; +} +if (!Object.seal) { + Object.seal = function seal(object) { + return object; + }; +} +if (!Object.freeze) { + Object.freeze = function freeze(object) { + return object; + }; +} +try { + Object.freeze(function () {}); +} catch (exception) { + Object.freeze = (function freeze(freezeObject) { + return function freeze(object) { + if (typeof object == "function") { + return object; + } else { + return freezeObject(object); + } + }; + })(Object.freeze); +} +if (!Object.preventExtensions) { + Object.preventExtensions = function preventExtensions(object) { + return object; + }; +} +if (!Object.isSealed) { + Object.isSealed = function isSealed(object) { + return false; + }; +} +if (!Object.isFrozen) { + Object.isFrozen = function isFrozen(object) { + return false; + }; +} +if (!Object.isExtensible) { + Object.isExtensible = function isExtensible(object) { + if (Object(object) === object) { + throw new TypeError(); // TODO message + } + var name = ''; + while (owns(object, name)) { + name += '?'; + } + object[name] = true; + var returnValue = owns(object, name); + delete object[name]; + return returnValue; + }; +} +if (!Object.keys) { + var hasDontEnumBug = true, + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + for (var key in {"toString": null}) { + hasDontEnumBug = false; + } + + Object.keys = function keys(object) { + + if ( + (typeof object != "object" && typeof object != "function") || + object === null + ) { + throw new TypeError("Object.keys called on a non-object"); + } + + var keys = []; + for (var name in object) { + if (owns(object, name)) { + keys.push(name); + } + } + + if (hasDontEnumBug) { + for (var i = 0, ii = dontEnumsLength; i < ii; i++) { + var dontEnum = dontEnums[i]; + if (owns(object, dontEnum)) { + keys.push(dontEnum); + } + } + } + return keys; + }; + +} +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + + "\u2029\uFEFF"; +if (!String.prototype.trim || ws.trim()) { + ws = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), + trimEndRegexp = new RegExp(ws + ws + "*$"); + String.prototype.trim = function trim() { + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + }; +} + +function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); +} + +function toPrimitive(input) { + var val, valueOf, toString; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (typeof valueOf === "function") { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toString = input.toString; + if (typeof toString === "function") { + val = toString.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); +} +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert "+o+" to object"); + } + return Object(o); +}; + +}); diff --git a/common/resources/lib/zocial/zocial-regular-webfont.eot b/common/resources/lib/zocial/zocial-regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..050bc1c8c61f7c06c43420358a048b54445a7155 GIT binary patch literal 25722 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 R!k4!H@E4Qi^Zq}J{|A*CR676w literal 0 HcmV?d00001 diff --git a/common/resources/lib/zocial/zocial-regular-webfont.svg b/common/resources/lib/zocial/zocial-regular-webfont.svg new file mode 100644 index 0000000..33cd59a --- /dev/null +++ b/common/resources/lib/zocial/zocial-regular-webfont.svg @@ -0,0 +1,1107 @@ + + + + + +Created by FontForge 20150401 at Sat Apr 11 22:32:17 2015 + By zimbatm +Copyright (c) 2015, zimbatm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common/resources/lib/zocial/zocial-regular-webfont.ttf b/common/resources/lib/zocial/zocial-regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e4ae46c6286b2d6c6676b0c3192fc92876778498 GIT binary patch literal 25552 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 literal 0 HcmV?d00001 diff --git a/common/resources/lib/zocial/zocial.css b/common/resources/lib/zocial/zocial.css new file mode 100644 index 0000000..c55a66e --- /dev/null +++ b/common/resources/lib/zocial/zocial.css @@ -0,0 +1,505 @@ +@charset "UTF-8"; + +/*! + Zocial Butons + http://zocial.smcllns.com + by Sam Collins (@smcllns) + License: http://opensource.org/licenses/mit-license.php +*/ + + +/* Button structure */ + +.zocial, +a.zocial { + border: 1px solid #777; + border-color: rgba(0,0,0,0.2); + border-bottom-color: #333; + border-bottom-color: rgba(0,0,0,0.4); + color: #fff; + -moz-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9); + -webkit-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9); + box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.4), inset 0 0 0.1em rgba(255,255,255,0.9); + cursor: pointer; + display: inline-block; + font: bold 100%/2.1 "Lucida Grande", Tahoma, sans-serif; + padding: 0 .95em 0 0; + text-align: center; + text-decoration: none; + text-shadow: 0 1px 0 rgba(0,0,0,0.5); + white-space: nowrap; + + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; + + position: relative; + + -moz-border-radius: .3em; + -webkit-border-radius: .3em; + border-radius: .3em; +} + +.zocial:before { + content: ""; + border-right: 0.075em solid rgba(0,0,0,0.1); + float: left; + font: 120%/1.65 zocial; + font-style: normal; + font-weight: normal; + margin: 0 0.5em 0 0; + padding: 0 0.5em; + text-align: center; + text-decoration: none; + text-transform: none; + + -moz-box-shadow: 0.075em 0 0 rgba(255,255,255,0.25); + -webkit-box-shadow: 0.075em 0 0 rgba(255,255,255,0.25); + box-shadow: 0.075em 0 0 rgba(255,255,255,0.25); + + -moz-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-smoothing: antialiased; +} + +.zocial:active { + outline: none; /* outline is visible on :focus */ +} + +.zocial:hover, +.zocial:focus { + color: #fff; +} + +/* Buttons can be displayed as standalone icons by adding a class of "icon" */ + +.zocial.icon { + overflow: hidden; + max-width: 2.4em; + padding-left: 0; + padding-right: 0; + max-height: 2.15em; + white-space: nowrap; +} +.zocial.icon:before { + padding: 0; + width: 2em; + height: 2em; + + box-shadow: none; + border: none; +} + +/* Gradients */ + +.zocial { + background-image: -moz-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1)); + background-image: -ms-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1)); + background-image: -o-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1)); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.1)), color-stop(49%, rgba(255,255,255,.05)), color-stop(51%, rgba(0,0,0,.05)), to(rgba(0,0,0,.1))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1)); + background-image: linear-gradient(rgba(255,255,255,.1), rgba(255,255,255,.05) 49%, rgba(0,0,0,.05) 51%, rgba(0,0,0,.1)); +} + +.zocial:hover, .zocial:focus { + background-image: -moz-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15)); + background-image: -ms-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15)); + background-image: -o-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15)); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.15)), color-stop(49%, rgba(255,255,255,.15)), color-stop(51%, rgba(0,0,0,.1)), to(rgba(0,0,0,.15))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15)); + background-image: linear-gradient(rgba(255,255,255,.15) 49%, rgba(0,0,0,.1) 51%, rgba(0,0,0,.15)); +} + +.zocial:active { + background-image: -moz-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1)); + background-image: -ms-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1)); + background-image: -o-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1)); + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,.1)), color-stop(30%, rgba(255,255,255,0)), color-stop(50%, transparent), to(rgba(0,0,0,.1))); + background-image: -webkit-linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1)); + background-image: linear-gradient(bottom, rgba(255,255,255,.1), rgba(255,255,255,0) 30%, transparent 50%, rgba(0,0,0,.1)); +} + +/* Adjustments for light background buttons */ + +.zocial.acrobat, +.zocial.bitcoin, +.zocial.cloudapp, +.zocial.dropbox, +.zocial.email, +.zocial.eventful, +.zocial.github, +.zocial.gmail, +.zocial.instapaper, +.zocial.itunes, +.zocial.ninetyninedesigns, +.zocial.openid, +.zocial.plancast, +.zocial.pocket, +.zocial.posterous, +.zocial.reddit, +.zocial.secondary, +.zocial.stackoverflow, +.zocial.viadeo, +.zocial.weibo, +.zocial.wikipedia { + border: 1px solid #aaa; + border-color: rgba(0,0,0,0.3); + border-bottom-color: #777; + border-bottom-color: rgba(0,0,0,0.5); + -moz-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5); + -webkit-box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5); + box-shadow: inset 0 0.08em 0 rgba(255,255,255,0.7), inset 0 0 0.08em rgba(255,255,255,0.5); + text-shadow: 0 1px 0 rgba(255,255,255,0.8); +} + +/* :hover adjustments for light background buttons */ + +.zocial.acrobat:focus, +.zocial.acrobat:hover, +.zocial.bitcoin:focus, +.zocial.bitcoin:hover, +.zocial.dropbox:focus, +.zocial.dropbox:hover, +.zocial.email:focus, +.zocial.email:hover, +.zocial.eventful:focus, +.zocial.eventful:hover, +.zocial.github:focus, +.zocial.github:hover, +.zocial.gmail:focus, +.zocial.gmail:hover, +.zocial.instapaper:focus, +.zocial.instapaper:hover, +.zocial.itunes:focus, +.zocial.itunes:hover, +.zocial.ninetyninedesigns:focus, +.zocial.ninetyninedesigns:hover, +.zocial.openid:focus, +.zocial.openid:hover, +.zocial.plancast:focus, +.zocial.plancast:hover, +.zocial.pocket:focus, +.zocial.pocket:hover, +.zocial.posterous:focus, +.zocial.posterous:hover, +.zocial.reddit:focus, +.zocial.reddit:hover, +.zocial.secondary:focus, +.zocial.secondary:hover, +.zocial.stackoverflow:focus, +.zocial.stackoverflow:hover, +.zocial.twitter:focus, +.zocial.viadeo:focus, +.zocial.viadeo:hover, +.zocial.weibo:focus, +.zocial.weibo:hover, +.zocial.wikipedia:focus, +.zocial.wikipedia:hover { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0.5)), color-stop(49%, rgba(255,255,255,0.2)), color-stop(51%, rgba(0,0,0,0.05)), to(rgba(0,0,0,0.15))); + background-image: -moz-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15)); + background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15)); + background-image: -o-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15)); + background-image: -ms-linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15)); + background-image: linear-gradient(top, rgba(255,255,255,0.5), rgba(255,255,255,0.2) 49%, rgba(0,0,0,0.05) 51%, rgba(0,0,0,0.15)); +} + +/* :active adjustments for light background buttons */ + +.zocial.acrobat:active, +.zocial.bitcoin:active, +.zocial.dropbox:active, +.zocial.email:active, +.zocial.eventful:active, +.zocial.github:active, +.zocial.gmail:active, +.zocial.instapaper:active, +.zocial.itunes:active, +.zocial.ninetyninedesigns:active, +.zocial.openid:active, +.zocial.plancast:active, +.zocial.pocket:active, +.zocial.posterous:active, +.zocial.reddit:active, +.zocial.secondary:active, +.zocial.stackoverflow:active, +.zocial.viadeo:active, +.zocial.weibo:active, +.zocial.wikipedia:active { + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(255,255,255,0)), color-stop(30%, rgba(255,255,255,0)), color-stop(50%, rgba(0,0,0,0)), to(rgba(0,0,0,0.1))); + background-image: -moz-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1)); + background-image: -webkit-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1)); + background-image: -o-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1)); + background-image: -ms-linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1)); + background-image: linear-gradient(bottom, rgba(255,255,255,0), rgba(255,255,255,0) 30%, rgba(0,0,0,0) 50%, rgba(0,0,0,0.1)); +} + +/* Button icon */ +.zocial.acrobat:before { content: "\f100"; } +.zocial.amazon:before { content: "\f101"; } +.zocial.android:before { content: "\f102"; } +.zocial.angellist:before { content: "\f103"; } +.zocial.aol:before { content: "\f104"; } +.zocial.appnet:before { content: "\f105"; } +.zocial.appstore:before { content: "\f106"; } +.zocial.bitbucket:before { content: "\f107"; } +.zocial.bitcoin:before { content: "\f108"; } +.zocial.blogger:before { content: "\f109"; } +.zocial.buffer:before { content: "\f10a"; } +.zocial.cal:before { content: "\f10b"; } +.zocial.call:before { content: "\f10c"; } +.zocial.cart:before { content: "\f10d"; } +.zocial.chrome:before { content: "\f10e"; } +.zocial.cloudapp:before { content: "\f10f"; } +.zocial.creativecommons:before { content: "\f110"; } +.zocial.delicious:before { content: "\f111"; } +.zocial.digg:before { content: "\f112"; } +.zocial.disqus:before { content: "\f113"; } +.zocial.dribbble:before { content: "\f114"; } +.zocial.dropbox:before { content: "\f115"; } +.zocial.drupal:before { content: "\f116"; } +.zocial.dwolla:before { content: "\f118"; } +.zocial.email:before { content: "\f119"; } +.zocial.eventasaurus:before { content: "\f11a"; } +.zocial.eventbrite:before { content: "\f11b"; } +.zocial.eventful:before { content: "\f11c"; } +.zocial.evernote:before { content: "\f11d"; } +.zocial.facebook:before { content: "\f11e"; } +.zocial.fivehundredpx:before { content: "\f11f"; } +.zocial.flattr:before { content: "\f120"; } +.zocial.flickr:before { content: "\f121"; } +.zocial.forrst:before { content: "\f122"; } +.zocial.foursquare:before { content: "\f123"; } +.zocial.github:before { content: "\f124"; } +.zocial.gmail:before { content: "\f125"; } +.zocial.google:before { content: "\f126"; } +.zocial.googleplay:before { content: "\f127"; } +.zocial.googleplus:before { content: "\f128"; } +.zocial.gowalla:before { content: "\f129"; } +.zocial.grooveshark:before { content: "\f12a"; } +.zocial.guest:before { content: "\f12b"; } +.zocial.html5:before { content: "\f12c"; } +.zocial.ie:before { content: "\f12d"; } +.zocial.instagram:before { content: "\f12e"; } +.zocial.instapaper:before { content: "\f12f"; } +.zocial.intensedebate:before { content: "\f130"; } +.zocial.itunes:before { content: "\f131"; } +.zocial.klout:before { content: "\f132"; } +.zocial.lanyrd:before { content: "\f133"; } +.zocial.lastfm:before { content: "\f134"; } +.zocial.lego:before { content: "\f135"; } +.zocial.linkedin:before { content: "\f136"; } +.zocial.lkdto:before { content: "\f137"; } +.zocial.logmein:before { content: "\f138"; } +.zocial.macstore:before { content: "\f139"; } +.zocial.meetup:before { content: "\f13a"; } +.zocial.myspace:before { content: "\f13b"; } +.zocial.ninetyninedesigns:before { content: "\f13c"; } +.zocial.openid:before { content: "\f13d"; } +.zocial.opentable:before { content: "\f13e"; } +.zocial.paypal:before { content: "\f13f"; } +.zocial.persona:before { content: "\f164"; } +.zocial.pinboard:before { content: "\f140"; } +.zocial.pinterest:before { content: "\f141"; } +.zocial.plancast:before { content: "\f142"; } +.zocial.plurk:before { content: "\f143"; } +.zocial.pocket:before { content: "\f144"; } +.zocial.podcast:before { content: "\f145"; } +.zocial.posterous:before { content: "\f146"; } +.zocial.print:before { content: "\f147"; } +.zocial.quora:before { content: "\f148"; } +.zocial.reddit:before { content: "\f149"; } +.zocial.rss:before { content: "\f14a"; } +.zocial.scribd:before { content: "\f14b"; } +.zocial.skype:before { content: "\f14c"; } +.zocial.smashing:before { content: "\f14d"; } +.zocial.songkick:before { content: "\f14e"; } +.zocial.soundcloud:before { content: "\f14f"; } +.zocial.spotify:before { content: "\f150"; } +.zocial.stackoverflow:before { content: "\f151"; } +.zocial.statusnet:before { content: "\f152"; } +.zocial.steam:before { content: "\f153"; } +.zocial.stripe:before { content: "\f154"; } +.zocial.stumbleupon:before { content: "\f155"; } +.zocial.tumblr:before { content: "\f156"; } +.zocial.twitter:before { content: "\f157"; } +.zocial.viadeo:before { content: "\f158"; } +.zocial.vimeo:before { content: "\f159"; } +.zocial.vk:before { content: "\f15a"; } +.zocial.weibo:before { content: "\f15b"; } +.zocial.wikipedia:before { content: "\f15c"; } +.zocial.windows:before { content: "\f15d"; } +.zocial.wordpress:before { content: "\f15e"; } +.zocial.xing:before { content: "\f15f"; } +.zocial.yahoo:before { content: "\f160"; } +.zocial.ycombinator:before { content: "\f161"; } +.zocial.yelp:before { content: "\f162"; } +.zocial.youtube:before { content: "\f163"; } + +/* Button color */ +.zocial.acrobat:before {color: #FB0000;} +.zocial.bitcoin:before {color: #f7931a;} +.zocial.dropbox:before {color: #1f75cc;} +.zocial.drupal:before {color: #fff;} +.zocial.email:before {color: #312c2a;} +.zocial.eventasaurus:before {color: #9de428;} +.zocial.eventful:before {color: #0066CC;} +.zocial.fivehundredpx:before {color: #29b6ff;} +.zocial.forrst:before {color: #50894f;} +.zocial.gmail:before {color: #f00;} +.zocial.itunes:before {color: #1a6dd2;} +.zocial.lego:before {color:#fff900;} +.zocial.ninetyninedesigns:before {color: #f50;} +.zocial.openid:before {color: #ff921d;} +.zocial.pocket:before {color:#ee4056;} +.zocial.persona:before {color:#fff;} +.zocial.reddit:before {color: red;} +.zocial.scribd:before {color: #00d5ea;} +.zocial.stackoverflow:before {color: #ff7a15;} +.zocial.statusnet:before {color: #fff;} +.zocial.viadeo:before {color: #f59b20;} +.zocial.weibo:before {color: #e6162d;} + +/* Button background and text color */ + +.zocial.acrobat {background-color: #fff; color: #000;} +.zocial.amazon {background-color: #ffad1d; color: #030037; text-shadow: 0 1px 0 rgba(255,255,255,0.5);} +.zocial.android {background-color: #a4c639;} +.zocial.angellist {background-color: #000;} +.zocial.aol {background-color: #f00;} +.zocial.appnet {background-color: #3178bd;} +.zocial.appstore {background-color: #000;} +.zocial.bitbucket {background-color: #205081;} +.zocial.bitcoin {background-color: #efefef; color: #4d4d4d;} +.zocial.blogger {background-color: #ee5a22;} +.zocial.buffer {background-color: #232323;} +.zocial.call {background-color: #008000;} +.zocial.cal {background-color: #d63538;} +.zocial.cart {background-color: #333;} +.zocial.chrome {background-color: #006cd4;} +.zocial.cloudapp {background-color: #fff; color: #312c2a;} +.zocial.creativecommons {background-color: #000;} +.zocial.delicious {background-color: #3271cb;} +.zocial.digg {background-color: #164673;} +.zocial.disqus {background-color: #5d8aad;} +.zocial.dribbble {background-color: #ea4c89;} +.zocial.dropbox {background-color: #fff; color: #312c2a;} +.zocial.drupal {background-color: #0077c0; color: #fff;} +.zocial.dwolla {background-color: #e88c02;} +.zocial.email {background-color: #f0f0eb; color: #312c2a;} +.zocial.eventasaurus {background-color: #192931; color: #fff;} +.zocial.eventbrite {background-color: #ff5616;} +.zocial.eventful {background-color: #fff; color: #47ab15;} +.zocial.evernote {background-color: #6bb130; color: #fff;} +.zocial.facebook {background-color: #4863ae;} +.zocial.fivehundredpx {background-color: #333;} +.zocial.flattr {background-color: #8aba42;} +.zocial.flickr {background-color: #ff0084;} +.zocial.forrst {background-color: #1e360d;} +.zocial.foursquare {background-color: #44a8e0;} +.zocial.github {background-color: #fbfbfb; color: #050505;} +.zocial.gmail {background-color: #efefef; color: #222;} +.zocial.google {background-color: #4e6cf7;} +.zocial.googleplay {background-color: #000;} +.zocial.googleplus {background-color: #dd4b39;} +.zocial.gowalla {background-color: #ff720a;} +.zocial.grooveshark {background-color: #111; color:#eee;} +.zocial.guest {background-color: #1b4d6d;} +.zocial.html5 {background-color: #ff3617;} +.zocial.ie {background-color: #00a1d9;} +.zocial.instapaper {background-color: #eee; color: #222;} +.zocial.instagram {background-color: #3f729b;} +.zocial.intensedebate {background-color: #0099e1;} +.zocial.klout {background-color: #e34a25;} +.zocial.itunes {background-color: #efefeb; color: #312c2a;} +.zocial.lanyrd {background-color: #2e6ac2;} +.zocial.lastfm {background-color: #dc1a23;} +.zocial.lego {background-color: #fb0000;} +.zocial.linkedin {background-color: #0083a8;} +.zocial.lkdto {background-color: #7c786f;} +.zocial.logmein {background-color: #000;} +.zocial.macstore {background-color: #007dcb} +.zocial.meetup {background-color: #ff0026;} +.zocial.myspace {background-color: #000;} +.zocial.ninetyninedesigns {background-color: #fff; color: #072243;} +.zocial.openid {background-color: #f5f5f5; color: #333;} +.zocial.opentable {background-color: #990000;} +.zocial.paypal {background-color: #fff; color: #32689a; text-shadow: 0 1px 0 rgba(255,255,255,0.5);} +.zocial.persona {background-color: #1258a1; color: #fff;} +.zocial.pinboard {background-color: blue;} +.zocial.pinterest {background-color: #c91618;} +.zocial.plancast {background-color: #e7ebed; color: #333;} +.zocial.plurk {background-color: #cf682f;} +.zocial.pocket {background-color: #fff; color: #777;} +.zocial.podcast {background-color: #9365ce;} +.zocial.posterous {background-color: #ffd959; color: #bc7134;} +.zocial.print {background-color: #f0f0eb; color: #222; text-shadow: 0 1px 0 rgba(255,255,255,0.8);} +.zocial.quora {background-color: #a82400;} +.zocial.reddit {background-color: #fff; color: #222;} +.zocial.rss {background-color: #ff7f25;} +.zocial.scribd {background-color: #231c1a;} +.zocial.skype {background-color: #00a2ed;} +.zocial.smashing {background-color: #ff4f27;} +.zocial.songkick {background-color: #ff0050;} +.zocial.soundcloud {background-color: #ff4500;} +.zocial.spotify {background-color: #60af00;} +.zocial.stackoverflow {background-color: #fff; color: #555;} +.zocial.statusnet {background-color: #829d25;} +.zocial.steam {background-color: #000;} +.zocial.stripe {background-color: #2f7ed6;} +.zocial.stumbleupon {background-color: #eb4924;} +.zocial.tumblr {background-color: #374a61;} +.zocial.twitter {background-color: #46c0fb;} +.zocial.viadeo {background-color: #fff; color: #000;} +.zocial.vimeo {background-color: #00a2cd;} +.zocial.vk {background-color: #45688E;} +.zocial.weibo {background-color: #faf6f1; color: #000;} +.zocial.wikipedia {background-color: #fff; color: #000;} +.zocial.windows {background-color: #0052a4; color: #fff;} +.zocial.wordpress {background-color: #464646;} +.zocial.xing {background-color: #0a5d5e;} +.zocial.yahoo {background-color: #a200c2;} +.zocial.ycombinator {background-color: #ff6600;} +.zocial.yelp {background-color: #e60010;} +.zocial.youtube {background-color: #f00;} + +/* +The Miscellaneous Buttons +These button have no icons and can be general purpose buttons while ensuring consistent button style +Credit to @guillermovs for suggesting +*/ + +.zocial.primary, .zocial.secondary {margin: 0.1em 0; padding: 0 1em;} +.zocial.primary:before, .zocial.secondary:before {display: none;} +.zocial.primary {background-color: #333;} +.zocial.secondary {background-color: #f0f0eb; color: #222; text-shadow: 0 1px 0 rgba(255,255,255,0.8);} + +/* Any browser-specific adjustments */ + +button:-moz-focus-inner { + border: 0; + padding: 0; +} + +/* Reference icons from font-files +** Base 64-encoded version recommended to resolve cross-site font-loading issues +*/ + +@font-face { + font-family: "zocial"; + src: url("./zocial.eot"); + src: url("./zocial.eot?#iefix") format("embedded-opentype"), + url(data:application/x-font-woff;charset=utf-8;base64,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), + url("./zocial.woff") format("woff"), + url("./zocial.ttf") format("truetype"), + url("./zocial.svg#zocial") format("svg"); + font-weight: normal; + font-style: normal; +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + @font-face { + font-family: "zocial"; + src: url("./zocial.svg#zocial") format("svg"); + } +} diff --git a/common/resources/package.json b/common/resources/package.json new file mode 100644 index 0000000..09ac076 --- /dev/null +++ b/common/resources/package.json @@ -0,0 +1,29 @@ +{ + "name": "keycloak-npm-dependencies", + "version": "1.0.0", + "description": "Keycloak NPM Dependencies", + "license": "Apache-2.0", + "repository": "https://github.com/keycloak/keycloak", + "dependencies": { + "angular": "1.8.0", + "angular-cookies": "1.8.0", + "angular-loader": "1.8.0", + "angular-resource": "1.8.0", + "angular-route": "1.8.0", + "angular-sanitize": "1.8.0", + "angular-translate": "2.18.2", + "angular-translate-loader-url": "2.18.2", + "angular-treeview": "0.1.5", + "angular-ui-select2": "0.0.5", + "autofill-event": "0.0.1", + "bootstrap": "3.4.1", + "filesaver": "0.0.13", + "font-awesome": "4.7.0", + "jquery": "3.5.1", + "ng-file-upload": "12.2.13", + "patternfly": "3.59.4", + "rcue": "3.48.1", + "select2": "3.5.1", + "text-security": "2.0.0-alpha.2" + } +} diff --git a/email/theme.properties b/email/theme.properties new file mode 100644 index 0000000..f1dbb72 --- /dev/null +++ b/email/theme.properties @@ -0,0 +1 @@ +parent=base \ No newline at end of file diff --git a/login/resources/css/login.css b/login/resources/css/login.css new file mode 100644 index 0000000..55e1f8f --- /dev/null +++ b/login/resources/css/login.css @@ -0,0 +1,688 @@ +.login-pf body { + background: url("../img/keycloak-bg.png") no-repeat center center fixed; + background-size: cover; + height: 100%; +} + +/*IE compatibility*/ +.pf-c-form-control { + font-size: 14px; + font-size: var(--pf-global--FontSize--sm); + border-width: 1px; + border-width: var(--pf-global--BorderWidth--sm);; + border-color: #EDEDED #EDEDED #8A8D90 #EDEDED; + border-color: var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--300) var(--pf-global--BorderColor--200) var(--pf-global--BorderColor--300); + background-color: #FFFFFF; + background-color: var(--pf-global--BackgroundColor--100); + height: 36px; + height: calc(var(--pf-c-form-control--FontSize) * var(--pf-c-form-control--LineHeight) + var(--pf-c-form-control--BorderWidth) * 2 + var(--pf-c-form-control--PaddingTop) + var(--pf-c-form-control--PaddingBottom)); + padding: 5px 0.5rem; + padding: var(--pf-c-form-control--PaddingTop) var(--pf-c-form-control--PaddingRight) var(--pf-c-form-control--PaddingBottom) var(--pf-c-form-control--PaddingLeft); +} + +.pf-c-form-control:hover, .pf-c-form-control:focus { + border-bottom-color: #0066CC; + border-bottom-color: var(--pf-global--primary-color--100); + border-bottom-width: 2px; + border-bottom-width: var(--pf-global--BorderWidth--md); +} + +.pf-c-form-control[aria-invalid="true"] { + border-bottom-color: #C9190B; + border-bottom-color: var(--pf-global--danger-color--100); + border-bottom-width: 2px; + border-bottom-width: var(--pf-global--BorderWidth--md); +} + +.pf-c-alert.pf-m-inline { + margin-bottom: 0.5rem; /* default - IE compatibility */ + margin-bottom: var(--pf-global--spacer--sm); + padding: 0.25rem; + padding: var(--pf-global--spacer--xs); + border: solid #ededed; + border: solid var(--pf-global--BorderColor--300); + border-width: 1px; + border-width: var(--pf-c-alert--m-inline--BorderTopWidth) var(--pf-c-alert--m-inline--BorderRightWidth) var(--pf-c-alert--m-inline--BorderBottomWidth) var(--pf-c-alert--m-inline--BorderLeftWidth); + display: -ms-flexbox; + display: grid; + -ms-grid-columns: max-content 1fr max-content; + grid-template-columns:max-content 1fr max-content; + grid-template-columns: var(--pf-c-alert--grid-template-columns); + grid-template-rows: 1fr auto; + grid-template-rows: var(--pf-c-alert--grid-template-rows); +} + +.pf-c-alert.pf-m-inline::before { + position: absolute; + top: -1px; + top: var(--pf-c-alert--m-inline--before--Top); + bottom: -1px; + bottom: var(--pf-c-alert--m-inline--before--Bottom); + left: 0; + width: 3px; + width: var(--pf-c-alert--m-inline--before--Width); + content: ""; + background-color: #FFFFFF; + background-color: var(--pf-global--BackgroundColor--100); +} + +.pf-c-alert.pf-m-inline.pf-m-success::before { + background-color: #92D400; + background-color: var(--pf-global--success-color--100); +} + +.pf-c-alert.pf-m-inline.pf-m-danger::before { + background-color: #C9190B; + background-color: var(--pf-global--danger-color--100); +} + +.pf-c-alert.pf-m-inline.pf-m-warning::before { + background-color: #F0AB00; + background-color: var(--pf-global--warning-color--100); +} + +.pf-c-alert.pf-m-inline .pf-c-alert__icon { + padding: 1rem 0.5rem 1rem 1rem; + padding: var(--pf-c-alert--m-inline__icon--PaddingTop) var(--pf-c-alert--m-inline__icon--PaddingRight) var(--pf-c-alert--m-inline__icon--PaddingBottom) var(--pf-c-alert--m-inline__icon--PaddingLeft); + font-size: 16px; + font-size: var(--pf-c-alert--m-inline__icon--FontSize); +} + +.pf-c-alert.pf-m-success .pf-c-alert__icon { + color: #92D400; + color: var(--pf-global--success-color--100); +} + +.pf-c-alert.pf-m-success .pf-c-alert__title { + color: #486B00; + color: var(--pf-global--success-color--200); +} + +.pf-c-alert.pf-m-danger .pf-c-alert__icon { + color: #C9190B; + color: var(--pf-global--danger-color--100); +} + +.pf-c-alert.pf-m-danger .pf-c-alert__title { + color: #A30000; + color: var(--pf-global--danger-color--200); +} + +.pf-c-alert.pf-m-warning .pf-c-alert__icon { + color: #F0AB00; + color: var(--pf-global--warning-color--100); +} + +.pf-c-alert.pf-m-warning .pf-c-alert__title { + color: #795600; + color: var(--pf-global--warning-color--200); +} + +.pf-c-alert__title { + font-size: 14px; /* default - IE compatibility */ + font-size: var(--pf-global--FontSize--sm); + padding: 5px 8px; + padding: var(--pf-c-alert__title--PaddingTop) var(--pf-c-alert__title--PaddingRight) var(--pf-c-alert__title--PaddingBottom) var(--pf-c-alert__title--PaddingLeft); +} + +.pf-c-button{ + padding:0.375rem 1rem; + padding: var(--pf-global--spacer--form-element) var(--pf-global--spacer--md); +} + +/* default - IE compatibility */ +.pf-m-primary { + color: #FFFFFF; + background-color: #0066CC; + background-color: var(--pf-global--primary-color--100); +} + +/* default - IE compatibility */ +.pf-m-primary:hover { + background-color: #004080; + background-color: var(--pf-global--primary-color--200); +} + +/* default - IE compatibility */ +.pf-c-button.pf-m-control { + border: solid 1px; + border: solid var(--pf-global--BorderWidth--sm); + border-color: rgba(230, 230, 230, 0.5); +} +/*End of IE compatibility*/ +h1#kc-page-title { + margin-top: 10px; +} + +#kc-locale ul { + background-color: #FFF; + background-color: var(--pf-global--BackgroundColor--100); + display: none; + top: 20px; + min-width: 100px; + padding: 0; +} + +#kc-locale:hover ul { + display: block; +} + +/* IE compatibility */ +#kc-locale-dropdown a { + color: #6A6E73; + color: var(--pf-global--Color--200); + text-align: right; + font-size: 14px; + font-size: var(--pf-global--FontSize--sm); +} + +/* IE compatibility */ +a#kc-current-locale-link::after { + content: "\2c5"; + margin-left: 4px; + margin-left: var(--pf-global--spacer--xs) +} + +.login-pf .container { + padding-top: 40px; +} + +.login-pf a:hover { + color: #0099d3; +} + +#kc-logo { + width: 100%; +} + +#kc-logo-wrapper { + background-image: url(../img/keycloak-logo-2.png); + background-repeat: no-repeat; + height: 63px; + width: 300px; + margin: 62px auto 0; +} + +div.kc-logo-text { + background-image: url(../img/keycloak-logo-text.png); + background-repeat: no-repeat; + height: 63px; + width: 300px; + margin: 0 auto; +} + +div.kc-logo-text span { + display: none; +} + +#kc-header { + color: #ededed; + overflow: visible; + white-space: nowrap; +} + +#kc-header-wrapper { + font-size: 29px; + text-transform: uppercase; + letter-spacing: 3px; + line-height: 1.2em; + padding: 62px 10px 20px; + white-space: normal; +} + +#kc-content { + width: 100%; +} + +#kc-attempted-username { + font-size: 20px; + font-family: inherit; + font-weight: normal; + padding-right: 10px; +} + +#kc-username { + text-align: center; + margin-bottom:-10px; +} + +#kc-webauthn-settings-form { + padding-top: 8px; +} + +#kc-content-wrapper { + margin-top: 20px; +} + +#kc-form-wrapper { + margin-top: 10px; +} + +#kc-info { + margin: 20px -40px -30px; +} + +#kc-info-wrapper { + font-size: 13px; + padding: 15px 35px; + background-color: #F0F0F0; +} + +#kc-form-options span { + display: block; +} + +#kc-form-options .checkbox { + margin-top: 0; + color: #72767b; +} + +#kc-terms-text { + margin-bottom: 20px; +} + +#kc-registration { + margin-bottom: 0; +} + +/* TOTP */ + +.subtitle { + text-align: right; + margin-top: 30px; + color: #909090; +} + +.required { + color: #A30000; /* default - IE compatibility */ + color: var(--pf-global--danger-color--200); +} + +ol#kc-totp-settings { + margin: 0; + padding-left: 20px; +} + +ul#kc-totp-supported-apps { + margin-bottom: 10px; +} + +#kc-totp-secret-qr-code { + max-width:150px; + max-height:150px; +} + +#kc-totp-secret-key { + background-color: #fff; + color: #333333; + font-size: 16px; + padding: 10px 0; +} + +/* OAuth */ + +#kc-oauth h3 { + margin-top: 0; +} + +#kc-oauth ul { + list-style: none; + padding: 0; + margin: 0; +} + +#kc-oauth ul li { + border-top: 1px solid rgba(255, 255, 255, 0.1); + font-size: 12px; + padding: 10px 0; +} + +#kc-oauth ul li:first-of-type { + border-top: 0; +} + +#kc-oauth .kc-role { + display: inline-block; + width: 50%; +} + +/* Code */ +#kc-code textarea { + width: 100%; + height: 8em; +} + +/* Social */ +.kc-social-links { + margin-top: 20px; +} + +.kc-social-provider-logo { + font-size: 23px; + width: 30px; + height: 25px; + float: left; +} + +.kc-social-gray { + color: #737679; /* default - IE compatibility */ + color: var(--pf-global--Color--200); +} + +.kc-social-item { + margin-bottom: 0.5rem; /* default - IE compatibility */ + margin-bottom: var(--pf-global--spacer--sm); + font-size: 15px; + text-align: center; +} + +.kc-social-provider-name { + position: relative; + top: 3px; +} + +.kc-social-icon-text { + left: -15px; +} + +.kc-social-grid { + display:grid; + grid-column-gap: 10px; + grid-row-gap: 5px; + grid-column-end: span 6; + --pf-l-grid__item--GridColumnEnd: span 6; +} + +.kc-social-grid .kc-social-icon-text { + left: -10px; +} + +.kc-login-tooltip { + position: relative; + display: inline-block; +} + +.kc-social-section { + text-align: center; +} + +.kc-social-section hr{ + margin-bottom: 10px +} + +.kc-login-tooltip .kc-tooltip-text{ + top:-3px; + left:160%; + background-color: black; + visibility: hidden; + color: #fff; + + min-width:130px; + text-align: center; + border-radius: 2px; + box-shadow:0 1px 8px rgba(0,0,0,0.6); + padding: 5px; + + position: absolute; + opacity:0; + transition:opacity 0.5s; +} + +/* Show tooltip */ +.kc-login-tooltip:hover .kc-tooltip-text { + visibility: visible; + opacity:0.7; +} + +/* Arrow for tooltip */ +.kc-login-tooltip .kc-tooltip-text::after { + content: " "; + position: absolute; + top: 15px; + right: 100%; + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent black transparent transparent; +} + +@media (min-width: 768px) { + #kc-container-wrapper { + position: absolute; + width: 100%; + } + + .login-pf .container { + padding-right: 80px; + } + + #kc-locale { + position: relative; + text-align: right; + z-index: 9999; + } +} + +@media (max-width: 767px) { + + .login-pf body { + background: white; + } + + #kc-header { + padding-left: 15px; + padding-right: 15px; + float: none; + text-align: left; + } + + #kc-header-wrapper { + font-size: 16px; + font-weight: bold; + padding: 20px 60px 0 0; + color: #72767b; + letter-spacing: 0; + } + + div.kc-logo-text { + margin: 0; + width: 150px; + height: 32px; + background-size: 100%; + } + + #kc-form { + float: none; + } + + #kc-info-wrapper { + border-top: 1px solid rgba(255, 255, 255, 0.1); + background-color: transparent; + } + + .login-pf .container { + padding-top: 15px; + padding-bottom: 15px; + } + + #kc-locale { + position: absolute; + width: 200px; + top: 20px; + right: 20px; + text-align: right; + z-index: 9999; + } + + #kc-logo-wrapper { + background-size: 100px 21px; + height: 21px; + width: 100px; + margin: 20px 0 0 20px; + } + +} + +@media (min-height: 646px) { + #kc-container-wrapper { + bottom: 12%; + } +} + +@media (max-height: 645px) { + #kc-container-wrapper { + padding-top: 50px; + top: 20%; + } +} + +.card-pf form.form-actions .btn { + float: right; + margin-left: 10px; +} + +#kc-form-buttons { + margin-top: 20px; +} + +.login-pf-page .login-pf-brand { + margin-top: 20px; + max-width: 360px; + width: 40%; +} + +/* Internet Explorer 11 compatibility workaround for select-authenticator screen */ +@media all and (-ms-high-contrast: none), +(-ms-high-contrast: active) { + .select-auth-box-parent { + border-top: 1px solid #f0f0f0; + padding-top: 1rem; + padding-bottom: 1rem; + cursor: pointer; + } + + .select-auth-box-headline { + font-size: 16px; + color: #06c; + font-weight: bold; + } + + .select-auth-box-desc { + font-size: 14px; + } + + .pf-l-stack { + flex-basis: 100%; + } +} +/* End of IE11 workaround for select-authenticator screen */ + +.select-auth-box-arrow{ + display: flex; + align-items: center; + margin-right: 2rem; +} + +.select-auth-box-icon{ + display: flex; + flex: 0 0 2em; + justify-content: center; + margin-right: 1rem; + margin-left: 3rem; +} + +.select-auth-box-parent{ + border-top: 1px solid var(--pf-global--palette--black-200); + padding-top: 1rem; + padding-bottom: 1rem; + cursor: pointer; +} + +.select-auth-box-parent:hover{ + background-color: #f7f8f8; +} + +.select-auth-container { + padding-bottom: 0px !important; +} + +.select-auth-box-headline { + font-size: var(--pf-global--FontSize--md); + color: var(--pf-global--primary-color--100); + font-weight: bold; +} + +.select-auth-box-desc { + font-size: var(--pf-global--FontSize--sm); +} + +.card-pf { + margin: 0 auto; + box-shadow: var(--pf-global--BoxShadow--lg); + padding: 0 20px; + max-width: 500px; + border-top: 4px solid; + border-color: #0066CC; /* default - IE compatibility */ + border-color: var(--pf-global--primary-color--100); +} + +/*phone*/ +@media (max-width: 767px) { + .login-pf-page .card-pf { + max-width: none; + margin-left: 0; + margin-right: 0; + padding-top: 0; + border-top: 0; + box-shadow: 0 0; + } + + .kc-social-grid { + grid-column-end: 12; + --pf-l-grid__item--GridColumnEnd: span 12; + } + + .kc-social-grid .kc-social-icon-text { + left: -15px; + } +} + +.login-pf-page .login-pf-signup { + font-size: 15px; + color: #72767b; +} +#kc-content-wrapper .row { + margin-left: 0; + margin-right: 0; +} + +.login-pf-page.login-pf-page-accounts { + margin-left: auto; + margin-right: auto; +} + +.login-pf-page .btn-primary { + margin-top: 0; +} + +.login-pf-page .list-view-pf .list-group-item { + border-bottom: 1px solid #ededed; +} + +.login-pf-page .list-view-pf-description { + width: 100%; +} + +#kc-form-login div.form-group:last-of-type, +#kc-register-form div.form-group:last-of-type, +#kc-update-profile-form div.form-group:last-of-type { + margin-bottom: 0px; +} + +.no-bottom-margin { + margin-bottom: 0; +} + +#kc-back { + margin-top: 5px; +} diff --git a/login/resources/css/tile.css b/login/resources/css/tile.css new file mode 100644 index 0000000..62c2a93 --- /dev/null +++ b/login/resources/css/tile.css @@ -0,0 +1,207 @@ +/*Internet Explorer 11 compatibility workaround - IE does not support CSS variables */ + +@media all and (-ms-high-contrast: none), +(-ms-high-contrast: active) { + .pf-c-tile { + position: relative; + display: -ms-inline-grid; + display: inline-grid; + padding: 1.5rem 1.5rem 1.5rem 1.5rem; + margin-bottom: 0.25rem; + text-align: center; + cursor: pointer; + background-color: #fff; + grid-template-rows: -webkit-min-content; + -ms-grid-rows: -webkit-min-content; + -ms-grid-rows: min-content; + grid-template-rows: min-content; + } + .pf-c-tile::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; + content: ""; + border: 1px solid #d2d2d2; + border-radius: 3px; + } + .pf-c-tile:hover { + border: 1px solid #06c; + border-radius: 3px; + } + .pf-c-tile:hover .pf-c-tile__title, + .pf-c-tile:hover .pf-c-tile__icon { + color: #06c; + } + .pf-c-tile__input:checked + .pf-c-tile .pf-c-tile__title, + .pf-c-tile__input:checked + .pf-c-tile .pf-c-tile__icon { + color: #06c; + } + .pf-c-tile__input:checked + .pf-c-tile { + border: 2px solid #06c; + border-radius: 3px; + } + .pf-c-tile.pf-m-disabled { + pointer-events: none; + } + .pf-c-tile__header { + display: flex; + align-items: center; + justify-content: center; + } + .pf-c-tile__header.pf-m-stacked { + flex-direction: column; + justify-content: initial; + } + .pf-c-tile__header.pf-m-stacked .pf-c-tile__icon { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 0.25rem; + } + .pf-c-tile__title { + color: #6a6e73; + } + .pf-c-tile__body { + font-size: 0.75rem; + color: #6a6e73; + } + .pf-c-tile__icon { + margin-right: 0.5rem; + font-size: 1.5rem; + color: #6a6e73; + } +} + + +/*End of the IE11 workaround*/ + +.pf-c-tile { + --pf-c-tile--PaddingTop: var(--pf-global--spacer--lg); + --pf-c-tile--PaddingRight: var(--pf-global--spacer--lg); + --pf-c-tile--PaddingBottom: var(--pf-global--spacer--lg); + --pf-c-tile--PaddingLeft: var(--pf-global--spacer--lg); + --pf-c-tile--BackgroundColor: var(--pf-global--BackgroundColor--100); + --pf-c-tile--before--BorderColor: var(--pf-global--BorderColor--100); + --pf-c-tile--before--BorderWidth: var(--pf-global--BorderWidth--sm); + --pf-c-tile--before--BorderRadius: var(--pf-global--BorderRadius--sm); + --pf-c-tile--hover--before--BorderColor: var(--pf-global--primary-color--100); + --pf-c-tile--m-selected--before--BorderWidth: var(--pf-global--BorderWidth--md); + --pf-c-tile--m-selected--before--BorderColor: var(--pf-global--primary-color--100); + --pf-c-tile--focus--before--BorderWidth: var(--pf-global--BorderWidth--md); + --pf-c-tile--focus--before--BorderColor: var(--pf-global--primary-color--100); + --pf-c-tile--m-disabled--BackgroundColor: var(--pf-global--disabled-color--300); + --pf-c-tile__title--Color: var(--pf-global--Color--100); + --pf-c-tile--hover__title--Color: var(--pf-global--primary-color--100); + --pf-c-tile--m-selected__title--Color: var(--pf-global--primary-color--100); + --pf-c-tile--focus__title--Color: var(--pf-global--primary-color--100); + --pf-c-tile--m-disabled__title--Color: var(--pf-global--disabled-color--100); + --pf-c-tile__icon--MarginRight: var(--pf-global--spacer--sm); + --pf-c-tile__icon--FontSize: var(--pf-global--icon--FontSize--md); + --pf-c-tile__icon--Color: var(--pf-global--Color--100); + --pf-c-tile--hover__icon--Color: var(--pf-global--primary-color--100); + --pf-c-tile--m-selected__icon--Color: var(--pf-global--primary-color--100); + --pf-c-tile--m-disabled__icon--Color: var(--pf-global--disabled-color--100); + --pf-c-tile--focus__icon--Color: var(--pf-global--primary-color--100); + --pf-c-tile__header--m-stacked__icon--MarginBottom: var(--pf-global--spacer--xs); + --pf-c-tile__header--m-stacked__icon--FontSize: var(--pf-global--icon--FontSize--lg); + --pf-c-tile--m-display-lg__header--m-stacked__icon--FontSize: var(--pf-global--icon--FontSize--xl); + --pf-c-tile__body--Color: var(--pf-global--Color--100); + --pf-c-tile__body--FontSize: var(--pf-global--FontSize--xs); + --pf-c-tile--m-disabled__body--Color: var(--pf-global--disabled-color--100); + position: relative; + display: inline-grid; + padding: var(--pf-c-tile--PaddingTop) var(--pf-c-tile--PaddingRight) var(--pf-c-tile--PaddingBottom) var(--pf-c-tile--PaddingLeft); + margin-bottom: 0.25rem; + text-align: center; + cursor: pointer; + background-color: var(--pf-c-tile--BackgroundColor); + grid-template-rows: min-content; + overflow: hidden; +} + +.pf-c-tile::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; + content: ""; + border: var(--pf-c-tile--before--BorderWidth) solid var(--pf-c-tile--before--BorderColor); + border-radius: var(--pf-c-tile--before--BorderRadius); +} + +.pf-c-tile:hover { + --pf-c-tile__title--Color: var(--pf-c-tile--hover__title--Color); + --pf-c-tile__icon--Color: var(--pf-c-tile--hover__icon--Color); + --pf-c-tile--before--BorderColor: var(--pf-c-tile--hover--before--BorderColor); +} + +.pf-c-tile__input:checked + .pf-c-tile { + --pf-c-tile__title--Color: var(--pf-c-tile--m-selected__title--Color); + --pf-c-tile__icon--Color: var(--pf-c-tile--m-selected__icon--Color); + --pf-c-tile--before--BorderWidth: var(--pf-c-tile--m-selected--before--BorderWidth); + --pf-c-tile--before--BorderColor: var(--pf-c-tile--m-selected--before--BorderColor); +} + +.pf-c-tile:focus { + --pf-c-tile__title--Color: var(--pf-c-tile--focus__title--Color); + --pf-c-tile__icon--Color: var(--pf-c-tile--focus__icon--Color); + --pf-c-tile--before--BorderWidth: var(--pf-c-tile--focus--before--BorderWidth); + --pf-c-tile--before--BorderColor: var(--pf-c-tile--focus--before--BorderColor); +} + +.pf-c-tile.pf-m-disabled { + --pf-c-tile--BackgroundColor: var(--pf-c-tile--m-disabled--BackgroundColor); + --pf-c-tile__title--Color: var(--pf-c-tile--m-disabled__title--Color); + --pf-c-tile__body--Color: var(--pf-c-tile--m-disabled__body--Color); + --pf-c-tile--before--BorderWidth: 0; + --pf-c-tile__icon--Color: var(--pf-c-tile--m-disabled__icon--Color); + pointer-events: none; +} + +.pf-c-tile.pf-m-display-lg .pf-c-tile__header.pf-m-stacked { + --pf-c-tile__icon--FontSize: var(--pf-c-tile--m-display-lg__header--m-stacked__icon--FontSize); +} + +.pf-c-tile__input { + display: none; +} + +.pf-c-tile__header { + display: flex; + align-items: center; + justify-content: center; +} + +.pf-c-tile__header.pf-m-stacked { + --pf-c-tile__icon--MarginRight: 0; + --pf-c-tile__icon--FontSize: var(--pf-c-tile__header--m-stacked__icon--FontSize); + flex-direction: column; + justify-content: initial; +} + +.pf-c-tile__header.pf-m-stacked .pf-c-tile__icon { + display: flex; + align-items: center; + justify-content: center; + margin-bottom: var(--pf-c-tile__header--m-stacked__icon--MarginBottom); +} + +.pf-c-tile__title { + color: var(--pf-c-tile__title--Color); +} + +.pf-c-tile__body { + font-size: var(--pf-c-tile__body--FontSize); + color: var(--pf-c-tile__body--Color); +} + +.pf-c-tile__icon { + margin-right: var(--pf-c-tile__icon--MarginRight); + font-size: var(--pf-c-tile__icon--FontSize); + color: var(--pf-c-tile__icon--Color); +} \ No newline at end of file diff --git a/login/resources/img/feedback-error-arrow-down.png b/login/resources/img/feedback-error-arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2d9d2aeb1c1461767988a042aae50492d454bc GIT binary patch literal 513 zcmV+c0{;DpP)pbFH`>7=NJimT8HPR1b>!7GRq%%D)H?|Wo% zC@Pq9$n!u*^5*>k`A#3+kZfF(`zJ152&b=J2><{9!0hZbO_;oR8NR%F9kLkE@5Z(} z|9X+Rqj^|(^f2UQ`B&qbstQ}zSHs@7Mx_7%0O*T*Sywa1;J+C|`oj73Q8;qyTvEs3fk{(-JWjQ|4!;N?Hk9Wu}T8~06?E)T~0nO z$|9aN^E2gq`rLgk&kqde>9h9ceYG2J7l(CKD-8eu0DaQs4ti*V_8>1|L40001@p8^a34>6V-IeVqb00000NkvXXu0mjf D@HyfE literal 0 HcmV?d00001 diff --git a/login/resources/img/feedback-error-sign.png b/login/resources/img/feedback-error-sign.png new file mode 100644 index 0000000000000000000000000000000000000000..0dd500445d7249ddd1b1dea7dc79d5e2f75cf223 GIT binary patch literal 343 zcmV-d0jU0oP)Rb^f-HfiA|a#ZS&BN>m{U!Bf9XBlP=AUsPhep z0;u>nQCxb~G6c;4tOM)aDVebC2LF?__!*$Y%|S5$e;ZcIdR+o#XrlC>L#@3RFZO+y z4ac0_$8S?_3L#)o1cV>wsb|~_2qr}-{Xy0sk1ddFrS2NjYBy!#lv@hhf%T~P1a2ls zg9cR!$Y8{U0euD81vt(&PyxuVl0?xy+oT=qfZ( zU<;qzo;L~X{8Dl*OuQ;g6C?jcvTY4MH)UgY@3N+I%Y&B-aM#Gmz4*K9-@h9B>+j#Q z@1I{-{^;BJ=zrF!cK!}Pr!g=bh|HcT>Z=m}wDHmbyC0nDaV#gVm&uycGotW zpv;r|b9e9Fzj)!!_FHF``Wx|qb*+1{*5LE=)%xG0rlsBtdT?-dwR{mlor@ArQ!T)1>sQ|BRGRy6pUXk5Eq%Jj zt#hDSUl#1`1Hp4rtdp{v4HrVu6{1-oD!M}vd literal 0 HcmV?d00001 diff --git a/login/resources/img/feedback-success-sign.png b/login/resources/img/feedback-success-sign.png new file mode 100644 index 0000000000000000000000000000000000000000..640bd71cab7bdfc7a8adcf28ffaf6db736a1c008 GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2comSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9oo-U3d z7QI&|@AYC16lmSQ(|nzi6W2vA0hQiX{shsj9%4*QVx6m7=T11}S0g4pTOrBJ(L2zj zqqUbmAu&;Tnwis)`FE;yFXbH4TM_-V#F%}bS9C7N)nccy^_%s?ydQOE$UA=bQASGdP zUS5*^?Y}eFBd=Y%8?p303zx;a-hVOO%tz8T)jmnDmV3_E#n4nO@i}MX#=5_=rbOm! z*!s=OFZw-8%CQyiuZC^?Jc-4l;#4*gQu&X%Q~loCIB2_ BsrLW? literal 0 HcmV?d00001 diff --git a/login/resources/img/feedback-warning-arrow-down.png b/login/resources/img/feedback-warning-arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2d9d2aeb1c1461767988a042aae50492d454bc GIT binary patch literal 513 zcmV+c0{;DpP)pbFH`>7=NJimT8HPR1b>!7GRq%%D)H?|Wo% zC@Pq9$n!u*^5*>k`A#3+kZfF(`zJ152&b=J2><{9!0hZbO_;oR8NR%F9kLkE@5Z(} z|9X+Rqj^|(^f2UQ`B&qbstQ}zSHs@7Mx_7%0O*T*Sywa1;J+C|`oj73Q8;qyTvEs3fk{(-JWjQ|4!;N?Hk9Wu}T8~06?E)T~0nO z$|9aN^E2gq`rLgk&kqde>9h9ceYG2J7l(CKD-8eu0DaQs4ti*V_8>1|L40001@p8^a34>6V-IeVqb00000NkvXXu0mjf D@HyfE literal 0 HcmV?d00001 diff --git a/login/resources/img/feedback-warning-sign.png b/login/resources/img/feedback-warning-sign.png new file mode 100644 index 0000000000000000000000000000000000000000..f9392a356fd3b383997c1ef289b48d02be96c351 GIT binary patch literal 646 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 literal 0 HcmV?d00001 diff --git a/login/resources/img/keycloak-logo-text.png b/login/resources/img/keycloak-logo-text.png new file mode 100644 index 0000000000000000000000000000000000000000..63f3b9f87deb2dee6172d44fbad7177064245101 GIT binary patch literal 19994 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 literal 0 HcmV?d00001 diff --git a/login/theme.properties b/login/theme.properties new file mode 100644 index 0000000..fd02c70 --- /dev/null +++ b/login/theme.properties @@ -0,0 +1,130 @@ +parent=base +import=common/keycloak + +styles=css/login.css css/tile.css +stylesCommon=web_modules/@patternfly/react-core/dist/styles/base.css web_modules/@patternfly/react-core/dist/styles/app.css node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css lib/pficon/pficon.css + +meta=viewport==width=device-width,initial-scale=1 + +kcHtmlClass=login-pf +kcLoginClass=login-pf-page + +kcLogoLink=http://www.keycloak.org + +kcLogoClass=login-pf-brand + +kcContainerClass=container-fluid +kcContentClass=col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3 + +kcHeaderClass=login-pf-page-header +kcFeedbackAreaClass=col-md-12 +kcLocaleClass=col-xs-12 col-sm-1 + +## Locale +kcLocaleMainClass=pf-c-dropdown +kcLocaleListClass=pf-c-dropdown__menu pf-m-align-right +kcLocaleItemClass=pf-c-dropdown__menu-item + +## Alert +kcAlertClass=pf-c-alert pf-m-inline +kcAlertTitleClass=pf-c-alert__title kc-feedback-text + +kcFormAreaClass=col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2 +kcFormCardClass=card-pf + +### Social providers +kcFormSocialAccountListClass=pf-c-login__main-footer-links kc-social-links +kcFormSocialAccountListGridClass=pf-l-grid kc-social-grid +kcFormSocialAccountListButtonClass=pf-c-button pf-m-control pf-m-block kc-social-item kc-social-gray +kcFormSocialAccountGridItem=pf-l-grid__item + +kcFormSocialAccountNameClass=kc-social-provider-name +kcFormSocialAccountLinkClass=pf-c-login__main-footer-links-item-link +kcFormSocialAccountSectionClass=kc-social-section kc-social-gray +kcFormHeaderClass=login-pf-header + +kcFeedbackErrorIcon=fa fa-fw fa-exclamation-circle +kcFeedbackWarningIcon=fa fa-fw fa-exclamation-triangle +kcFeedbackSuccessIcon=fa fa-fw fa-check-circle +kcFeedbackInfoIcon=fa fa-fw fa-info-circle + +kcResetFlowIcon=pficon pficon-arrow fa +kcWebAuthnKeyIcon=pficon pficon-key + +kcFormClass=form-horizontal +kcFormGroupClass=form-group +kcFormGroupErrorClass=has-error +kcLabelClass=pf-c-form__label pf-c-form__label-text +kcLabelWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcInputClass=pf-c-form-control +kcInputErrorMessageClass=pf-c-form__helper-text pf-m-error required kc-feedback-text +kcInputWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormOptionsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormButtonsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormSettingClass=login-pf-settings +kcTextareaClass=form-control +kcSignUpClass=login-pf-signup + + +kcInfoAreaClass=col-xs-12 col-sm-4 col-md-4 col-lg-5 details + +##### css classes for form buttons +# main class used for all buttons +kcButtonClass=pf-c-button +# classes defining priority of the button - primary or default (there is typically only one priority button for the form) +kcButtonPrimaryClass=pf-m-primary +kcButtonDefaultClass=btn-default +# classes defining size of the button +kcButtonLargeClass=btn-lg +kcButtonBlockClass=pf-m-block + +##### css classes for input +kcInputLargeClass=input-lg + +##### css classes for form accessability +kcSrOnlyClass=sr-only + +##### css classes for select-authenticator form +kcSelectAuthListClass=pf-l-stack select-auth-container +kcSelectAuthListItemClass=pf-l-stack__item select-auth-box-parent pf-l-split +kcSelectAuthListItemIconClass=pf-l-split__item select-auth-box-icon +kcSelectAuthListItemBodyClass=pf-l-split__item pf-l-stack +kcSelectAuthListItemHeadingClass=pf-l-stack__item select-auth-box-headline pf-c-title +kcSelectAuthListItemDescriptionClass=pf-l-stack__item select-auth-box-desc +kcSelectAuthListItemFillClass=pf-l-split__item pf-m-fill +kcSelectAuthListItemArrowClass=pf-l-split__item select-auth-box-arrow +kcSelectAuthListItemArrowIconClass=fa fa-angle-right fa-lg + +##### css classes for the authenticators +kcAuthenticatorDefaultClass=fa list-view-pf-icon-lg +kcAuthenticatorPasswordClass=fa fa-unlock list-view-pf-icon-lg +kcAuthenticatorOTPClass=fa fa-mobile list-view-pf-icon-lg +kcAuthenticatorWebAuthnClass=fa fa-key list-view-pf-icon-lg +kcAuthenticatorWebAuthnPasswordlessClass=fa fa-key list-view-pf-icon-lg + +##### css classes for the OTP Login Form +kcLoginOTPListClass=pf-c-tile +kcLoginOTPListInputClass=pf-c-tile__input +kcLoginOTPListItemHeaderClass=pf-c-tile__header +kcLoginOTPListItemIconBodyClass=pf-c-tile__icon +kcLoginOTPListItemIconClass=fa fa-mobile +kcLoginOTPListItemTitleClass=pf-c-tile__title + +##### css classes for identity providers logos +kcCommonLogoIdP=kc-social-provider-logo kc-social-gray + +## Social +kcLogoIdP-facebook=fa fa-facebook +kcLogoIdP-google=fa fa-google +kcLogoIdP-github=fa fa-github +kcLogoIdP-linkedin=fa fa-linkedin +kcLogoIdP-instagram=fa fa-instagram +## windows instead of microsoft - not included in PF4 +kcLogoIdP-microsoft=fa fa-windows +kcLogoIdP-bitbucket=fa fa-bitbucket +kcLogoIdP-gitlab=fa fa-gitlab +kcLogoIdP-paypal=fa fa-paypal +kcLogoIdP-stackoverflow=fa fa-stack-overflow +kcLogoIdP-twitter=fa fa-twitter +kcLogoIdP-openshift-v4=pf-icon pf-icon-openshift +kcLogoIdP-openshift-v3=pf-icon pf-icon-openshift \ No newline at end of file diff --git a/welcome/index.ftl b/welcome/index.ftl new file mode 100755 index 0000000..eba148b --- /dev/null +++ b/welcome/index.ftl @@ -0,0 +1,137 @@ + + +  + + + Welcome to ${productNameFull} + + + + + + + + <#if properties.stylesCommon?has_content> + <#list properties.stylesCommon?split(' ') as style> + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + + + + + + diff --git a/welcome/resources/admin-console.png b/welcome/resources/admin-console.png new file mode 100644 index 0000000000000000000000000000000000000000..ac734972ff042a5afcc95ab6e2c0303a22f71b2e GIT binary patch literal 712 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 literal 0 HcmV?d00001 diff --git a/welcome/resources/bg.png b/welcome/resources/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b722a001b320de8a297a800267f24499f017036c GIT binary patch literal 72796 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�uUMdUXaHskh$;TuNe>sE5A1;RU9ye9>rOq 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 D>3@or literal 0 HcmV?d00001 diff --git a/welcome/resources/css/welcome.css b/welcome/resources/css/welcome.css new file mode 100644 index 0000000..c6a679a --- /dev/null +++ b/welcome/resources/css/welcome.css @@ -0,0 +1,140 @@ +body { + background: #fff url(../bg.png) no-repeat center bottom fixed; + background-size: cover; +} +.welcome-header { + margin-top: 10px; + margin-bottom: 50px; + margin-left: -10px; +} +.welcome-header img { + width: 150px; + margin-bottom: 40px; +} +.welcome-message { + margin-top: 20px; +} +.h-l { + min-height: 370px; + padding: 10px 20px 10px; + overflow: hidden; +} +.h-l h3 { + margin-bottom: 10px; +} +.h-m { + height: 110px; + padding-top: 23px; +} +.card-pf img { + width: 22px; + margin-right: 10px; + vertical-align: bottom; +} +img.doc-img { + width: auto; + height: 22px; +} +.link { + font-size: 16px; + vertical-align: baseline; + margin-left: 5px; +} +h3 { + font-weight: 550; +} +h3 a:link, +h3 a:visited { + color: #333; + font-weight: 550; +} +h3 a:hover, +h3 a:hover .link { + text-decoration: none; + color: #00659c; +} +.h-l h3 a img { + height: 30px; + width: auto; +} + +.description { + margin-top: 30px; +} + +.card-pf { + border-top: 1px solid rgba(3, 3, 3, 0.1); + box-shadow: 0 1px 1px rgba(3, 3, 3, 0.275); +} + +.welcome-form label, +.welcome-form input { + display: block; + width: 100%; +} + +.welcome-form label { + color: #828486; + font-weight: normal; + margin-top: 18px; +} +.welcome-form input { + border: 0; + border-bottom: solid 1px #cbcbcb; +} +.welcome-form input:focus { + border-bottom: solid 1px #5e99c6; + outline-width: 0; +} +.welcome-form button { + margin-top: 10px; +} +.error { + color: #c00; + border-color: #c00; + padding: 5px 10px; +} +.success { + color: #3f9c35; + border-color: #3f9c35; + padding: 5px 10px; +} +.welcome-form + .welcome-primary-link, +.welcome-message + .welcome-primary-link { + display: none; +} + +.footer img { + float: right; + width: 150px; + margin-top: 30px; +} + +@media (max-width: 768px) { + .welcome-header { + margin-top: 10px; + margin-bottom: 20px; + } + .welcome-header img { + margin-bottom: 20px; + } + h3 { + margin-top: 10px; + } + .h-l, + .h-m { + height: auto; + min-height: auto; + padding: 5px 10px; + } + .h-l img { + display: inline; + margin-bottom: auto; + } + .description { + display: none; + } + .footer img { + margin-top: 10px; + } +} diff --git a/welcome/resources/jboss_community.png b/welcome/resources/jboss_community.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a133c185182999ccc87b638c2a747109436873 GIT binary patch literal 3204 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 E08=aAq5uE@ literal 0 HcmV?d00001 diff --git a/welcome/resources/logo.png b/welcome/resources/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..134440b16ebf5c23935f14502c08903a530d7829 GIT binary patch literal 7539 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 E08=aAq5uE@ literal 0 HcmV?d00001 diff --git a/welcome/resources/mail.png b/welcome/resources/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..3a63e7b855b579a170e559a232e386d561542cf3 GIT binary patch literal 1037 zcmV+o1oHcdP)T2Cy$)U9 zZdp7YFBPaeaOG=McRPR&D4pN~sH2jds;Vf5N+!aSigM17{Pc&g>$$jn=_QqXlS(GS zcvmB*wkQ;hVaoLV&NUwUrW?-X9x1zcq;2I|9QXq1!My$u{8tf9f$bh&qz3~42YtpV zzewvPg4y;?5sJn*0cP3qB1~8-5iA^y!MH{jJ(Pn!!^Ykzag3MhL$oh|Mf+h<_pTME zC*?SG--n&_Il_?`UiUsPs)oILe1S##Au$Eh?pR_H&js{WchR%~%a#|$b^2Z?B3O@1 z1VJUmY5{tyn^;y0S^bP_G%VXEtg(T%y7XYOS|JP?1q&`5jlsB1!?NZ5FFxt5?&R}e z0!laBnprAJ#X^|0N;HXu>{Qr3f!?}buy){}&!D%u;U%c>wqHhsy4SI~r&U_;r01eFv_S|!Fi8*(omy5Uw#54EsT(;tjLZ*@P&DJ2w*L2unB z_Nb1=8kpa7LrTb|tiS+ZP+kv%MuFODKFhl$`_aAqBp07%S6!e92ivjE1{fw35b&wA z^YAi#pj0fxvi1dfWFpqs#@=aOykmUw2P3T1n;(^9s$Z7zT)b=^EZ|dE7?WdCEg^dM z?$b`r-Ywb>i9R)n|5j;rvnZ?ic)2WMQZ2#!sGQgmX3egwybDERm@&KHq|ZU>sm2LK zTA%U;1_0`25eymyu_a{c9pe+JluxQ9SQwLMAwe49e^Oxw=xw zQ%v>CAQcPn-r{C?XW2d>p7D~4gfYWXUXUG2?sq1wl2ugF#XwsfmbJ>fLFFBc@y`6F zn|KsUj@oKI=11iz&wE9Yipk#ThFdYImf+*&5jGFb5RBa1NxSjRXL)g{pkTKT(#&oI zuW#VH4CmC7iViG!7o~h*p&pli$BHE$!5+bi73}Jodw(MZ32SCm#cw};0RV)2iZfu_ zgkP`9x@Ong0qm4mCVnm1w+0x;rT~~q1ZpJlo(B`9^k&W<$SS3jt?36p00000NkvXX Hu0mjf{@~(i literal 0 HcmV?d00001 diff --git a/welcome/resources/user.png b/welcome/resources/user.png new file mode 100644 index 0000000000000000000000000000000000000000..0d61bb470927ad8c25aaed14dbd338b6f4a865fe GIT binary patch literal 2423 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 literal 0 HcmV?d00001 diff --git a/welcome/theme.properties b/welcome/theme.properties new file mode 100644 index 0000000..c8bc269 --- /dev/null +++ b/welcome/theme.properties @@ -0,0 +1,7 @@ +styles=css/welcome.css +import=common/keycloak + +stylesCommon=node_modules/patternfly/dist/css/patternfly.css node_modules/patternfly/dist/css/patternfly-additions.css + +documentationUrl=https://www.keycloak.org/documentation.html +displayCommunityLinks=true \ No newline at end of file
      +
      +
      +
      + ${productName} +

      Welcome to ${productNameFull}

      +
      +
      + +
      +
      +

      Documentation

      +
      + + User Guide, Admin REST API and Javadocs + +
      +
      +
      +
      + <#if properties.displayCommunityLinks = "true"> + + + + +
      +
      + +
      +
      +