graphdb-workbench 2.4.0-RC3 → 2.4.0-RC5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/108.21ba9a6de554ddab0cb3.bundle.js +1 -1
  2. package/dist/{11.b8dcd88ee59c47a2c324.bundle.js → 11.c4ba55be8ec43dc4f602.bundle.js} +1 -1
  3. package/dist/{12.e6a377cf888480f8f98d.bundle.js → 12.49ccce6742a1415aec3c.bundle.js} +2 -2
  4. package/dist/149.5eef5d6c3bb15eb7db68.bundle.js +1 -0
  5. package/dist/{159.a2ea6062128ef461dc72.bundle.js → 159.2dfa76b41b8e0412fc9a.bundle.js} +1 -1
  6. package/dist/167.9ea529c0a3b5ecd3997a.bundle.js +1 -0
  7. package/dist/168.c2d77ca1c6e78c85cc1c.bundle.js +1 -0
  8. package/dist/{171.4f08cb300ca1440a3307.bundle.js → 171.57b7cb8f53876670f290.bundle.js} +1 -1
  9. package/dist/{198.55e79d00713b2500f203.bundle.js → 198.bef3c928879a4f4e88f8.bundle.js} +1 -1
  10. package/dist/{2.c65777063a36c091a5bd.bundle.js → 2.b340e8a1374b41c1d31e.bundle.js} +1 -1
  11. package/dist/{20.c6da63eaca8c7d70114f.bundle.js → 20.4e3d03b01e7af56d4100.bundle.js} +1 -1
  12. package/dist/22.a052dbb90cc265342e5a.bundle.js +1 -1
  13. package/dist/{25.e270178ce42ba8e4e7ee.bundle.js → 25.ef0ae4d289d27514ee5c.bundle.js} +1 -1
  14. package/dist/29.23338c84d369c009f196.bundle.js +1 -1
  15. package/dist/{34.899bb892150c400098bf.bundle.js → 34.406736c7cf1269a90b35.bundle.js} +1 -1
  16. package/dist/36.55a3af7ce65b4b20033b.bundle.js +1 -1
  17. package/dist/{44.f4994f939a8ea66f5529.bundle.js → 44.14f58271400c03d0ab79.bundle.js} +1 -1
  18. package/dist/48.4d17d325f11d472a147d.bundle.js +1 -1
  19. package/dist/{bundle.b51cb0800fa0b21c0a17.bundle.js → bundle.9270374dffa4437895d3.bundle.js} +12 -12
  20. package/dist/css/bootstrap-graphdb-theme.css +86 -27
  21. package/dist/css/graphs-vizualizations.css +4 -7
  22. package/dist/css/operations-statuses-monitor.css +41 -14
  23. package/dist/css/rdf-details-side-panel.css +7 -0
  24. package/dist/css/rdf-resource-search.css +5 -0
  25. package/dist/i18n/locale-en.json +3 -10
  26. package/dist/i18n/locale-fr.json +3 -10
  27. package/dist/index.html +74 -62
  28. package/dist/js/angular/chatgpt/templates/chat.html +1 -1
  29. package/dist/js/angular/core/directives/languageselector/templates/languageSelector.html +2 -2
  30. package/dist/js/angular/core/directives/operations-statuses-monitor/templates/operations-statuses-monitor.html +39 -33
  31. package/dist/js/angular/core/directives/rdfresourcesearch/templates/rdfResourceSearchTemplate.html +2 -2
  32. package/dist/js/angular/security/templates/user.html +2 -2
  33. package/dist/license-checker.json +2 -2
  34. package/dist/main.ef1675ae9664feabc0d4.css +1 -0
  35. package/dist/pages/aclmanagement.html +1 -1
  36. package/dist/pages/autocomplete.html +1 -1
  37. package/dist/pages/choose-repository-type.html +1 -1
  38. package/dist/pages/cluster-management/clusterInfo.html +3 -3
  39. package/dist/pages/create-index.html +4 -4
  40. package/dist/pages/dependencies.html +1 -1
  41. package/dist/pages/domainRangeInfo.html +2 -2
  42. package/dist/pages/edit.html +1 -1
  43. package/dist/pages/explore.html +1 -1
  44. package/dist/pages/export.html +1 -1
  45. package/dist/pages/find.html +1 -1
  46. package/dist/pages/graph-config/saveGraphConfig.html +11 -11
  47. package/dist/pages/graphs-visualizations.html +9 -8
  48. package/dist/pages/guides.html +1 -1
  49. package/dist/pages/home.html +1 -1
  50. package/dist/pages/import.html +1 -1
  51. package/dist/pages/jdbc-create.html +5 -5
  52. package/dist/pages/login.html +2 -2
  53. package/dist/pages/monitor/backup-and-restore.html +1 -1
  54. package/dist/pages/monitor/queries.html +1 -1
  55. package/dist/pages/monitor/resources.html +2 -2
  56. package/dist/pages/namespaces.html +2 -2
  57. package/dist/pages/plugins.html +1 -1
  58. package/dist/pages/rdfClassHierarchyInfo.html +7 -7
  59. package/dist/pages/rdfrank.html +2 -2
  60. package/dist/pages/repositories.html +2 -2
  61. package/dist/pages/repository.html +2 -2
  62. package/dist/pages/similarity-indexes.html +1 -1
  63. package/dist/pages/sparql-template-create.html +5 -5
  64. package/dist/pages/sparql.html +4 -4
  65. package/dist/pages/webapi.html +2 -2
  66. package/dist/plugins.js +6 -0
  67. package/dist/res/swagger/index.html +27 -27
  68. package/package.json +1 -1
  69. package/dist/149.c84b40c41514c33f06b2.bundle.js +0 -1
  70. package/dist/167.d7ebfad05a69c9ff7914.bundle.js +0 -1
  71. package/dist/168.2d82f1a487dc3ce888b0.bundle.js +0 -1
  72. package/dist/main.268656904f8e722f5489.css +0 -1
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[108],{114:function(t,e,i){"use strict";i.r(e);i(6),i(25);const r=angular.module("graphdb.framework.impex.import.directives",["graphdb.framework.utils.uriutils"]);r.directive("validateUri",["UriUtils",function(t){return{restrict:"A",require:"ngModel",link:function(e,i,r,a){a.$parsers.unshift((function(i){let r=!0;return"named"===e.target&&(r=t.isValidIri(i)),a.$setValidity("validateUri",r),i}))}}}]),r.directive("filesTable",(function(){return{restrict:"A",templateUrl:"js/angular/import/templates/filesTable.html"}})),r.directive("filesOntoLoader",(function(){return{link:function(t,e,i){t.$watch("file.status",(function(){"IMPORTING"!==t.file.status&&"UPLOADING"!==t.file.status||!$(e).has("object").length>0&&$(e).append('<object width="'+i.size+'" height="'+i.size+'" data="js/angular/templates/loader/ot-loader.svg?v=2.4.0-RC3">{{\'common.loading\' | translate}}</object>')}))}}}))}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[108],{114:function(t,e,i){"use strict";i.r(e);i(6),i(25);const r=angular.module("graphdb.framework.impex.import.directives",["graphdb.framework.utils.uriutils"]);r.directive("validateUri",["UriUtils",function(t){return{restrict:"A",require:"ngModel",link:function(e,i,r,a){a.$parsers.unshift((function(i){let r=!0;return"named"===e.target&&(r=t.isValidIri(i)),a.$setValidity("validateUri",r),i}))}}}]),r.directive("filesTable",(function(){return{restrict:"A",templateUrl:"js/angular/import/templates/filesTable.html"}})),r.directive("filesOntoLoader",(function(){return{link:function(t,e,i){t.$watch("file.status",(function(){"IMPORTING"!==t.file.status&&"UPLOADING"!==t.file.status||!$(e).has("object").length>0&&$(e).append('<object width="'+i.size+'" height="'+i.size+'" data="js/angular/templates/loader/ot-loader.svg?v=2.4.0-RC5">{{\'common.loading\' | translate}}</object>')}))}}}))}}]);
@@ -1 +1 @@
1
- (window.webpackJsonp=window.webpackJsonp||[]).push([[11],{132:function(e,r,t){"use strict";t.r(r);t(6),t(23),t(35),t(36);var s=t(3);const n=function(e){return e.location?`${e.id}@${e.location}`:e.id},o=angular.module("graphdb.framework.security.controllers",["ngCookies","ui.bootstrap","graphdb.framework.core.services.jwtauth","graphdb.framework.core.services.openIDService","graphdb.framework.rest.security.service","toastr","ngTagsInput"]),i=function(e){let r=s.UserType.USER;const t={READ_REPO:{},WRITE_REPO:{}},n={},o=[];for(let i=0;i<e.length;i++){const a=e[i];if(a===s.UserRole.ROLE_ADMIN)r=s.UserType.ADMIN;else if(a===s.UserRole.ROLE_REPO_MANAGER)r!==s.UserType.ADMIN&&(r=s.UserType.REPO_MANAGER);else if(a===s.UserRole.ROLE_USER)r=s.UserType.USER;else if(0===a.indexOf("READ_REPO_")||0===a.indexOf("WRITE_REPO_")){const e=a.indexOf("_",a.indexOf("_")+1),r=a.substr(0,e),s=a.substr(e+1);t[r][s]=!0,n[s]=n[s]||{},"READ_REPO"===r?n[s].read=!0:"WRITE_REPO"===r&&(n[s].write=!0)}else 0===a.indexOf("CUSTOM_")&&o.push(a.substr("CUSTOM_".length))}return{userType:r,userTypeDescription:s.UserUtils.getUserRoleName(r),grantedAuthorities:t,repositories:n,customRoles:o}};o.controller("LoginCtrl",["$scope","$http","toastr","$jwtAuth","$openIDAuth","$location","$rootScope","$translate",function(e,r,t,s,n,o,i,a){e.username="",e.password="",s.reinitializeSecurity(),e.loginWithOpenID=function(){s.loginOpenID()},o.search().noaccess?t.error(a.instant("security.no.rights.config.error"),a.instant("security.login.error")):o.search().expired&&t.error(a.instant("security.auth.token.expired"),a.instant("security.login.error")),e.isGDBLoginEnabled=function(){return s.passwordLoginEnabled},e.isOpenIDEnabled=function(){return s.openIDEnabled},e.login=function(){return r({method:"POST",url:"rest/login",data:{username:e.username,password:e.password}}).success((function(e,r,t){s.authenticate(e,t("Authorization")).then(()=>{i.returnToUrl?o.url(i.returnToUrl):o.path("/")})})).error((function(r,s){if(401===s)t.error(a.instant("security.wrong.credentials"),a.instant("common.error")),e.wrongCredentials=!0,e.username="",e.password="";else{const e=getError(r);t.error(e,s)}}))}}]),o.controller("UsersCtrl",["$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityRestService","$translate",function(e,r,t,s,o,a,u,c,p){e.loader=!0,e.securityEnabled=function(){return o.isSecurityEnabled()},e.hasExternalAuth=function(){return o.hasExternalAuth()},e.getAuthImplementation=function(){return o.getAuthImplementation()},e.freeAccessEnabled=function(){return o.isFreeAccessEnabled()},e.getUsers=function(){c.getUsers().success((function(r){e.users=r;for(let r=0;r<e.users.length;r++){const t=i(e.users[r].grantedAuthorities);e.users[r].userType=t.userType,e.users[r].userTypeDescription=t.userTypeDescription,e.users[r].repositories=t.repositories,e.users[r].customRoles=t.customRoles}e.loader=!1})).error((function(r){const s=getError(r);t.error(s,p.instant("common.error")),e.loader=!1}))},e.getUsers(),e.$on("repositoryIsSet",(function(){e.getUsers()})),e.toggleSecurity=function(){if(o.toggleSecurity(!o.isSecurityEnabled()),o.isSecurityEnabled()){const r=a((function(){s.location.reload()}),500);e.$on("$destroy",(function(){a.cancel(r)}))}},e.toggleFreeAccess=function(t){!o.isFreeAccessEnabled()||o.isFreeAccessEnabled()&&t?c.getFreeAccess().then((function(s){let i=s.data.authorities,a=s.data.appSettings||{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};r.open({templateUrl:"js/angular/security/templates/modal/default-authorities.html",controller:"DefaultAuthoritiesCtrl",resolve:{data:function(){return{defaultAuthorities:function(){const r={READ_REPO:{},WRITE_REPO:{}},t=_.mapKeys(e.getRepositories(),(function(e){return n(e)}));return _.each(i,(function(e){0===e.indexOf("WRITE_REPO_")?t.hasOwnProperty(e.substr(11))&&(r.WRITE_REPO[e.substr(11)]=!0):0===e.indexOf("READ_REPO_")&&t.hasOwnProperty(e.substr(10))&&(r.READ_REPO[e.substr(10)]=!0)})),r},appSettings:a}}}}).result.then((function(e){i=e.authorities,a=e.appSettings,o.toggleFreeAccess(t||!o.isFreeAccessEnabled(),i,a,t)}))})):o.toggleFreeAccess(!o.isFreeAccessEnabled(),[])},e.editFreeAccess=function(){e.toggleFreeAccess(!0)},e.removeUser=function(r){u.openSimpleModal({title:p.instant("common.confirm.delete"),message:p.instant("security.confirm.delete.user",{name:r}),warning:!0}).result.then((function(){e.loader=!0,c.deleteUser(r).success((function(){e.getUsers()})).error((function(r){const s=getError(r);t.error(s,p.instant("common.error")),e.loader=!1}))}))},e.encodeURIComponent=function(e){return encodeURIComponent(e)}}]),o.controller("DefaultAuthoritiesCtrl",["$scope","$http","$uibModalInstance","data","$rootScope",function(e,r,t,s,o){e.grantedAuthorities=s.defaultAuthorities(),e.appSettings=s.appSettings,e.hasActiveLocation=function(){return!_.isEmpty(o.globalLocation)},e.getRepositories=function(){return o.globalRepositories},e.ok=function(){const r=[];e.repositoryCheckError=!0;for(const t in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[t]&&(r.push("WRITE_REPO_"+t),r.push("READ_REPO_"+t),e.repositoryCheckError=!1);for(const t in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[t]&&-1===r.indexOf("READ_REPO_"+t)&&(r.push("READ_REPO_"+t),e.repositoryCheckError=!1);e.repositoryCheckError||t.close({authorities:r,appSettings:e.appSettings})},e.cancel=function(){t.dismiss("cancel")},e.createUniqueKey=function(e){return n(e)}}]),o.controller("CommonUserCtrl",["$rootScope","$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$translate","passwordPlaceholder",function(e,r,t,o,i,a,u,c,p,d){e.$on("$translateChangeSuccess",(function(){r.passwordPlaceholder=p.instant(d)})),r.isAdmin=function(){return c.hasRole(s.UserRole.ROLE_ADMIN)},r.hasExternalAuth=function(){return c.hasExternalAuth()},r.hasEditRestrictions=function(){return r.user&&r.user.username===s.UserType.ADMIN},r.isOverrideAuth=function(){return c.isDefaultAuthEnabled()},r.setGrantedAuthorities=function(){!function(e){function r(){for(let r=0;r<arguments.length;r++){const t=arguments[r];_.indexOf(e.user.grantedAuthorities,t)<0&&e.user.grantedAuthorities.push(t)}}if(e.user.grantedAuthorities=[],e.repositoryCheckError=!0,e.userType===s.UserType.ADMIN)e.repositoryCheckError=!1,r(s.UserRole.ROLE_ADMIN);else if(e.userType===s.UserType.REPO_MANAGER)e.repositoryCheckError=!1,r(s.UserRole.ROLE_REPO_MANAGER);else{r(s.UserRole.ROLE_USER);for(const t in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[t]&&(e.repositoryCheckError=!1,r("WRITE_REPO_"+t,"READ_REPO_"+t));for(const t in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[t]&&(e.repositoryCheckError=!1,r("READ_REPO_"+t))}e.customRoles&&e.customRoles.forEach(e=>r("CUSTOM_"+e))}(r)},r.$watch("userType",(function(){r.isUser()||(r.customRoles="")})),r.isUser=function(){return r.userType===s.UserType.USER},r.hasReadPermission=function(e){const t=n(e);return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&(r.grantedAuthorities.READ_REPO["*"]||r.grantedAuthorities.WRITE_REPO["*"])||r.grantedAuthorities.READ_REPO[t]||r.grantedAuthorities.WRITE_REPO[t]},r.hasWritePermission=function(e){const t=n(e);return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&r.grantedAuthorities.WRITE_REPO["*"]||r.grantedAuthorities.WRITE_REPO[t]},r.readCheckDisabled=function(e){return r.hasWritePermission(e)||"SYSTEM"!==e.id&&"*"!==e&&r.grantedAuthorities.READ_REPO["*"]||r.hasEditRestrictions()},r.writeCheckDisabled=function(e){return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&"*"!==e&&r.grantedAuthorities.WRITE_REPO["*"]||r.hasEditRestrictions()},r.createUniqueKey=function(e){return n(e)},r.userType=s.UserType.USER,r.grantedAuthorities={READ_REPO:{},WRITE_REPO:{}},r.validatePassword=function(){return r.noPassword?(r.passwordError="",r.confirmPasswordError="",!0):r.user.password!==r.user.confirmpassword?(r.user.password?(r.passwordError="",r.confirmPasswordError=p.instant("security.confirm.password")):(r.passwordError=p.instant("security.enter.password"),r.confirmPasswordError=""),!1):(r.passwordError="",r.confirmPasswordError="",!0)},r.isLocalAuthentication=function(){return"Local"===c.getAuthImplementation()},r.updateUser=function(){if(!r.validateForm())return!1;r.isLocalAuthentication()&&r.setGrantedAuthorities(),r.repositoryCheckError||r.updateUserHttp()},r.setNoPassword=function(){r.noPassword&&(r.user.password="",r.user.confirmpassword="",r.passwordError="",r.confirmPasswordError="")},r.shouldDisableSameAs=function(){const e=$("#sameAsCheck");return r.user&&!r.user.appSettings.DEFAULT_INFERENCE&&e.prop("checked")&&(e.prop("checked",!1),r.user.appSettings.DEFAULT_SAMEAS=!1),r.user&&!r.user.appSettings.DEFAULT_INFERENCE},r.addCustomRole=function(e){return e.text=e.text.toUpperCase(),e}}]),o.controller("AddUserCtrl",["$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$controller","SecurityRestService","ModalService","$translate",function(e,r,t,n,o,i,a,u,c,p,d){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.password.placeholder"})),e.mode="add",e.saveButtonText=d.instant("common.create.btn"),e.goBack=function(){const r=o((function(){n.history.back()}),100);e.$on("$destroy",(function(){o.cancel(r)}))},e.pageTitle=d.instant("view.create.user.title"),e.passwordPlaceholder=d.instant("security.password.placeholder"),e.user={username:"",password:"",confirmpassword:"",grantedAuthorities:[],appSettings:{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0}},e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?p.openSimpleModal({title:d.instant("security.create.admin"),message:d.instant("security.admin.login.warning"),warning:!0}).result.then((function(){e.createUser()})):e.createUser()},e.createUserHttp=function(){e.loader=!0,c.createUser({username:e.user.username,pass:e.user.password,appSettings:e.user.appSettings,grantedAuthorities:e.user.grantedAuthorities}).success((function(){t.success(d.instant("security.user.created",{name:e.user.username}));const r=o((function(){e.loader=!1,n.history.back()}),2e3);e.$on("$destroy",(function(){o.cancel(r)}))})).error((function(r){const s=getError(r);e.loader=!1,t.error(s,d.instant("common.error"))}))},e.createUser=function(){e.validateForm()&&(e.setGrantedAuthorities(),e.repositoryCheckError||e.createUserHttp())},e.validateForm=function(){let r=!0;return e.user.username?e.usernameError="":(e.usernameError=d.instant("security.enter.username"),r=!1),e.noPassword?(e.passwordError="",e.confirmPasswordError=""):(e.user.password?e.passwordError="":(e.passwordError=d.instant("security.enter.password"),r=!1),e.user.confirmpassword&&e.user.password===e.user.confirmpassword?e.confirmPasswordError="":(e.confirmPasswordError=d.instant("security.confirm.password"),r=!1)),r}}]),o.controller("EditUserCtrl",["$scope","$http","toastr","$window","$routeParams","$timeout","$location","$jwtAuth","$controller","SecurityRestService","ModalService","$translate",function(e,r,t,n,o,a,u,c,p,d,l,E){angular.extend(this,p("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"})),e.mode="edit",e.saveButtonText=E.instant("common.save.btn"),e.goBack=function(){const r=a((function(){n.history.back()}),100);e.$on("$destroy",(function(){a.cancel(r)}))},e.params=o,e.pageTitle=E.instant("view.edit.user.title",{userId:e.params.userId}),e.passwordPlaceholder=E.instant("security.new.password"),e.userType=s.UserType.USER;const g={DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};c.hasRole(s.UserRole.ROLE_ADMIN)||u.url("settings"),e.getUserData=function(){d.getUser(e.params.userId).success((function(r){e.userData=r,e.user={username:e.userData.username},e.user.password="",e.user.confirmpassword="",e.user.external=e.userData.external,e.user.appSettings=r.appSettings||g,e.userType=s.UserType.USER;const t=i(r.grantedAuthorities);e.userType=t.userType,e.grantedAuthorities=t.grantedAuthorities,e.customRoles=t.customRoles})).error((function(e){const r=getError(e);t.error(r,E.instant("common.error"))}))},e.getUserData(),e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?l.openSimpleModal({title:E.instant("security.save.admin.settings"),message:E.instant("security.admin.pass.unset"),warning:!0}).result.then((function(){e.updateUser()})):e.updateUser()},e.updateUserHttp=function(){e.loader=!0,d.updateUser({username:e.user.username,pass:e.noPassword?"":e.user.password||void 0,appSettings:e.user.appSettings,grantedAuthorities:e.user.grantedAuthorities}).success((function(){t.success(E.instant("security.user.updated",{name:e.user.username}));const r=a((function(){e.loader=!1,n.history.back()}),2e3);e.$on("$destroy",(function(){a.cancel(r)})),c.getPrincipal().then(r=>{e.user.username===r.username&&(r.appSettings=e.user.appSettings)})})).error((function(r){const s=getError(r);e.loader=!1,t.error(s,E.instant("common.error"))}))},e.validateForm=function(){return e.validatePassword()}}]),o.controller("RolesMappingController",["$scope","toastr","SecurityRestService","$translate",function(e,r,t,s){e.debugMapping=function(e,r){const s=r.split(":");t.getRolesMapping({role:e,method:s[1],mapping:s[0]})};e.$on("repositoryIsSet",(function(){t.getRoles().success((function(r){e.roleMappings=r,e.roles=_.keys(e.roleMappings),e.mappings=_.keys(e.roleMappings[e.roles[0]]);const t=_.map(e.roles,(function(r){return[r,_.filter(e.roleMappings[r]).length]}));e.roles=_.reverse(_.map(_.orderBy(t,(function(e){return e[1]})),(function(e){return e[0]})))})).error((function(t){const n=getError(t);e.loader=!1,r.error(n,s.instant("common.error"))}))}))}]),o.controller("ChangeUserPasswordSettingsCtrl",["$scope","toastr","$window","$timeout","$jwtAuth","$rootScope","$controller","SecurityRestService","ModalService","$translate","ThemeService","WorkbenchSettingsStorageService","$q",function(e,r,t,n,o,a,u,c,p,d,l,E,g){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"})),e.themes=l.getThemes(),e.mode="settings",e.showWorkbenchSettings=!0,e.workbenchSettings=E.getWorkbenchSettings(),e.saveButtonText=d.instant("common.save.btn"),e.pageTitle=d.instant("view.settings.title"),e.passwordPlaceholder=d.instant("security.new.password"),e.grantedAuthorities={READ_REPO:{},WRITE_REPO:{}},e.loader=!1,e.selectedTheme=l.getTheme(),e.hasEditRestrictions=function(){return!0},e.goBack=function(){const r=n((function(){t.history.back()}),100);e.$on("$destroy",(function(){n.cancel(r)}))},e.getPrincipal=function(){return o.getPrincipal().then(r=>{e.currentUserData=angular.copy(r)})},e.getPrincipal().then(()=>{e.redirectAdmin(),h(e)}),e.updateCurrentUserData=function(){g.when(o.getPrincipal()).then(r=>_.assign(r,e.userData))},e.redirectAdmin=function(){e.currentUserData||a.redirectToLogin()};const h=function(r){r.userData=angular.copy(r.currentUserData),r.user={username:r.userData.username},r.user.password="",r.user.confirmpassword="",r.user.external=r.userData.external,r.user.appSettings=r.userData.appSettings,void 0===r.user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA&&(r.user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA=!0);const t=i(r.userData.authorities);e.userType=t.userType,e.grantedAuthorities=t.grantedAuthorities,e.customRoles=t.customRoles};e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?p.openSimpleModal({title:d.instant("security.save.admin.settings"),message:d.instant("security.admin.pass.unset"),warning:!0}).result.then((function(){e.updateUser()})):e.updateUser()},e.updateUserHttp=function(){e.loader=!0,c.updateUserData({username:e.user.username,pass:e.noPassword?"":e.user.password||void 0,appSettings:e.user.appSettings}).success((function(){e.updateCurrentUserData(),r.success(d.instant("security.user.updated",{name:e.user.username}));const s=n((function(){e.loader=!1,t.history.back()}),2e3);E.saveWorkbenchSettings(e.workbenchSettings),e.$on("$destroy",(function(){n.cancel(s)}))})).error((function(t){const s=getError(t);e.loader=!1,r.error(s,d.instant("common.error"))}))},e.updateUser=function(){if(!e.validateForm())return!1;e.updateUserHttp()},e.validateForm=function(){return e.validatePassword()},e.setThemeMode=function(){l.toggleThemeMode(e.workbenchSettings.mode)},e.setTheme=r=>{e.selectedTheme=r,e.workbenchSettings.theme=r.name,l.applyTheme(r.name)},e.$on("$destroy",(function(){const e=E.getWorkbenchSettings();l.toggleThemeMode(e.mode)}));e.workbenchSettings||(e.workbenchSettings={theme:"light"}),e.setThemeMode()}]),o.controller("DeleteUserCtrl",["$scope","$uibModalInstance","username",function(e,r,t){e.username=t,e.ok=function(){r.close()},e.cancel=function(){r.dismiss("cancel")}}])}}]);
1
+ (window.webpackJsonp=window.webpackJsonp||[]).push([[11],{132:function(e,r,t){"use strict";t.r(r);t(6),t(23),t(35),t(36);var s=t(3);const n=function(e){return e.location?`${e.id}@${e.location}`:e.id},o=angular.module("graphdb.framework.security.controllers",["ngCookies","ui.bootstrap","graphdb.framework.core.services.jwtauth","graphdb.framework.core.services.openIDService","graphdb.framework.rest.security.service","toastr","ngTagsInput"]),i=function(e){let r=s.UserType.USER;const t={READ_REPO:{},WRITE_REPO:{}},n={},o=[];for(let i=0;i<e.length;i++){const a=e[i];if(a===s.UserRole.ROLE_ADMIN)r=s.UserType.ADMIN;else if(a===s.UserRole.ROLE_REPO_MANAGER)r!==s.UserType.ADMIN&&(r=s.UserType.REPO_MANAGER);else if(a===s.UserRole.ROLE_USER)r=s.UserType.USER;else if(0===a.indexOf("READ_REPO_")||0===a.indexOf("WRITE_REPO_")){const e=a.indexOf("_",a.indexOf("_")+1),r=a.substr(0,e),s=a.substr(e+1);t[r][s]=!0,n[s]=n[s]||{},"READ_REPO"===r?n[s].read=!0:"WRITE_REPO"===r&&(n[s].write=!0)}else 0===a.indexOf("CUSTOM_")&&o.push(a.substr("CUSTOM_".length))}return{userType:r,userTypeDescription:s.UserUtils.getUserRoleName(r),grantedAuthorities:t,repositories:n,customRoles:o}};o.controller("LoginCtrl",["$scope","$http","toastr","$jwtAuth","$openIDAuth","$location","$rootScope","$translate",function(e,r,t,s,n,o,i,a){e.username="",e.password="",s.reinitializeSecurity(),e.loginWithOpenID=function(){s.loginOpenID()},o.search().noaccess?t.error(a.instant("security.no.rights.config.error"),a.instant("security.login.error")):o.search().expired&&t.error(a.instant("security.auth.token.expired"),a.instant("security.login.error")),e.isGDBLoginEnabled=function(){return s.passwordLoginEnabled},e.isOpenIDEnabled=function(){return s.openIDEnabled},e.login=function(){return r({method:"POST",url:"rest/login",data:{username:e.username,password:e.password}}).success((function(e,r,t){s.authenticate(e,t("Authorization")).then(()=>{i.returnToUrl?o.url(i.returnToUrl):o.path("/")})})).error((function(r,s){if(401===s)t.error(a.instant("security.wrong.credentials"),a.instant("common.error")),e.wrongCredentials=!0,e.username="",e.password="";else{const e=getError(r);t.error(e,s)}}))}}]),o.controller("UsersCtrl",["$scope","$uibModal","toastr","$window","$jwtAuth","$timeout","ModalService","SecurityRestService","$translate",function(e,r,t,s,o,a,u,c,p){e.loader=!0,e.securityEnabled=function(){return o.isSecurityEnabled()},e.hasExternalAuth=function(){return o.hasExternalAuth()},e.getAuthImplementation=function(){return o.getAuthImplementation()},e.freeAccessEnabled=function(){return o.isFreeAccessEnabled()},e.getUsers=function(){c.getUsers().success((function(r){e.users=r;for(let r=0;r<e.users.length;r++){const t=i(e.users[r].grantedAuthorities);e.users[r].userType=t.userType,e.users[r].userTypeDescription=t.userTypeDescription,e.users[r].repositories=t.repositories,e.users[r].customRoles=t.customRoles}e.loader=!1})).error((function(r){const s=getError(r);t.error(s,p.instant("common.error")),e.loader=!1}))},e.getUsers(),e.$on("repositoryIsSet",(function(){e.getUsers()})),e.toggleSecurity=function(){if(o.toggleSecurity(!o.isSecurityEnabled()),o.isSecurityEnabled()){const r=a((function(){s.location.reload()}),500);e.$on("$destroy",(function(){a.cancel(r)}))}},e.toggleFreeAccess=function(t){!o.isFreeAccessEnabled()||o.isFreeAccessEnabled()&&t?c.getFreeAccess().then((function(s){let i=s.data.authorities,a=s.data.appSettings||{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};r.open({templateUrl:"js/angular/security/templates/modal/default-authorities.html",controller:"DefaultAuthoritiesCtrl",resolve:{data:function(){return{defaultAuthorities:function(){const r={READ_REPO:{},WRITE_REPO:{}},t=_.mapKeys(e.getRepositories(),(function(e){return n(e)}));return _.each(i,(function(e){0===e.indexOf("WRITE_REPO_")?t.hasOwnProperty(e.substr(11))&&(r.WRITE_REPO[e.substr(11)]=!0):0===e.indexOf("READ_REPO_")&&t.hasOwnProperty(e.substr(10))&&(r.READ_REPO[e.substr(10)]=!0)})),r},appSettings:a}}}}).result.then((function(e){i=e.authorities,a=e.appSettings,o.toggleFreeAccess(t||!o.isFreeAccessEnabled(),i,a,t)}))})):o.toggleFreeAccess(!o.isFreeAccessEnabled(),[])},e.editFreeAccess=function(){e.toggleFreeAccess(!0)},e.removeUser=function(r){u.openSimpleModal({title:p.instant("common.confirm.delete"),message:p.instant("security.confirm.delete.user",{name:r}),warning:!0}).result.then((function(){e.loader=!0,c.deleteUser(r).success((function(){e.getUsers()})).error((function(r){const s=getError(r);t.error(s,p.instant("common.error")),e.loader=!1}))}))},e.encodeURIComponent=function(e){return encodeURIComponent(e)}}]),o.controller("DefaultAuthoritiesCtrl",["$scope","$http","$uibModalInstance","data","$rootScope",function(e,r,t,s,o){e.grantedAuthorities=s.defaultAuthorities(),e.appSettings=s.appSettings,e.hasActiveLocation=function(){return!_.isEmpty(o.globalLocation)},e.getRepositories=function(){return o.globalRepositories},e.ok=function(){const r=[];e.repositoryCheckError=!0;for(const t in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[t]&&(r.push("WRITE_REPO_"+t),r.push("READ_REPO_"+t),e.repositoryCheckError=!1);for(const t in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[t]&&-1===r.indexOf("READ_REPO_"+t)&&(r.push("READ_REPO_"+t),e.repositoryCheckError=!1);e.repositoryCheckError||t.close({authorities:r,appSettings:e.appSettings})},e.cancel=function(){t.dismiss("cancel")},e.createUniqueKey=function(e){return n(e)}}]),o.controller("CommonUserCtrl",["$rootScope","$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$translate","passwordPlaceholder",function(e,r,t,o,i,a,u,c,p,d){e.$on("$translateChangeSuccess",(function(){r.passwordPlaceholder=p.instant(d)})),r.isAdmin=function(){return c.hasRole(s.UserRole.ROLE_ADMIN)},r.hasExternalAuth=function(){return c.hasExternalAuth()},r.hasEditRestrictions=function(){return r.user&&r.user.username===s.UserType.ADMIN},r.isOverrideAuth=function(){return c.isDefaultAuthEnabled()},r.setGrantedAuthorities=function(){!function(e){function r(){for(let r=0;r<arguments.length;r++){const t=arguments[r];_.indexOf(e.user.grantedAuthorities,t)<0&&e.user.grantedAuthorities.push(t)}}if(e.user.grantedAuthorities=[],e.repositoryCheckError=!0,e.userType===s.UserType.ADMIN)e.repositoryCheckError=!1,r(s.UserRole.ROLE_ADMIN);else if(e.userType===s.UserType.REPO_MANAGER)e.repositoryCheckError=!1,r(s.UserRole.ROLE_REPO_MANAGER);else{r(s.UserRole.ROLE_USER);for(const t in e.grantedAuthorities.WRITE_REPO)e.grantedAuthorities.WRITE_REPO[t]&&(e.repositoryCheckError=!1,r("WRITE_REPO_"+t,"READ_REPO_"+t));for(const t in e.grantedAuthorities.READ_REPO)e.grantedAuthorities.READ_REPO[t]&&(e.repositoryCheckError=!1,r("READ_REPO_"+t))}e.customRoles&&e.customRoles.forEach(e=>r("CUSTOM_"+e))}(r)},r.$watch("userType",(function(){r.isUser()||(r.customRoles="")})),r.isUser=function(){return r.userType===s.UserType.USER},r.hasReadPermission=function(e){const t=n(e);return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&(r.grantedAuthorities.READ_REPO["*"]||r.grantedAuthorities.WRITE_REPO["*"])||r.grantedAuthorities.READ_REPO[t]||r.grantedAuthorities.WRITE_REPO[t]},r.hasWritePermission=function(e){const t=n(e);return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&r.grantedAuthorities.WRITE_REPO["*"]||r.grantedAuthorities.WRITE_REPO[t]},r.readCheckDisabled=function(e){return r.hasWritePermission(e)||"SYSTEM"!==e.id&&"*"!==e&&r.grantedAuthorities.READ_REPO["*"]||r.hasEditRestrictions()},r.writeCheckDisabled=function(e){return r.userType===s.UserType.ADMIN||r.userType===s.UserType.REPO_MANAGER||"SYSTEM"!==e.id&&"*"!==e&&r.grantedAuthorities.WRITE_REPO["*"]||r.hasEditRestrictions()},r.createUniqueKey=function(e){return n(e)},r.userType=s.UserType.USER,r.grantedAuthorities={READ_REPO:{},WRITE_REPO:{}},r.validatePassword=function(){return r.noPassword?(r.passwordError="",r.confirmPasswordError="",!0):r.user.password!==r.user.confirmpassword?(r.user.password?(r.passwordError="",r.confirmPasswordError=p.instant("security.confirm.password")):(r.passwordError=p.instant("security.enter.password"),r.confirmPasswordError=""),!1):(r.passwordError="",r.confirmPasswordError="",!0)},r.isLocalAuthentication=function(){return"Local"===c.getAuthImplementation()},r.updateUser=function(){if(!r.validateForm())return!1;r.isLocalAuthentication()&&r.setGrantedAuthorities(),r.repositoryCheckError||r.updateUserHttp()},r.setNoPassword=function(){r.noPassword&&(r.user.password="",r.user.confirmpassword="",r.passwordError="",r.confirmPasswordError="")},r.shouldDisableSameAs=function(){const e=$("#sameAsCheck");return r.user&&!r.user.appSettings.DEFAULT_INFERENCE&&e.prop("checked")&&(e.prop("checked",!1),r.user.appSettings.DEFAULT_SAMEAS=!1),r.user&&!r.user.appSettings.DEFAULT_INFERENCE},r.addCustomRole=function(e){return e.text=e.text.toUpperCase(),e}}]),o.controller("AddUserCtrl",["$scope","$http","toastr","$window","$timeout","$location","$jwtAuth","$controller","SecurityRestService","ModalService","$translate",function(e,r,t,n,o,i,a,u,c,p,d){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.password.placeholder"})),e.mode="add",e.saveButtonText=d.instant("common.create.btn"),e.goBack=function(){const r=o((function(){n.history.back()}),100);e.$on("$destroy",(function(){o.cancel(r)}))},e.pageTitle=d.instant("view.create.user.title"),e.passwordPlaceholder=d.instant("security.password.placeholder"),e.user={username:"",password:"",confirmpassword:"",grantedAuthorities:[],appSettings:{DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0}},e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?p.openSimpleModal({title:d.instant("security.create.admin"),message:d.instant("security.admin.login.warning"),warning:!0}).result.then((function(){e.createUser()})):e.createUser()},e.createUserHttp=function(){e.loader=!0,c.createUser({username:e.user.username,pass:e.user.password,appSettings:e.user.appSettings,grantedAuthorities:e.user.grantedAuthorities}).success((function(){t.success(d.instant("security.user.created",{name:e.user.username}));const r=o((function(){e.loader=!1,n.history.back()}),2e3);e.$on("$destroy",(function(){o.cancel(r)}))})).error((function(r){const s=getError(r);e.loader=!1,t.error(s,d.instant("common.error"))}))},e.createUser=function(){e.validateForm()&&(e.setGrantedAuthorities(),e.repositoryCheckError||e.createUserHttp())},e.validateForm=function(){let r=!0;return e.user.username?e.usernameError="":(e.usernameError=d.instant("security.enter.username"),r=!1),e.noPassword?(e.passwordError="",e.confirmPasswordError=""):(e.user.password?e.passwordError="":(e.passwordError=d.instant("security.enter.password"),r=!1),e.user.confirmpassword&&e.user.password===e.user.confirmpassword?e.confirmPasswordError="":(e.confirmPasswordError=d.instant("security.confirm.password"),r=!1)),r}}]),o.controller("EditUserCtrl",["$scope","$http","toastr","$window","$routeParams","$timeout","$location","$jwtAuth","$controller","SecurityRestService","ModalService","$translate",function(e,r,t,n,o,a,u,c,p,d,l,E){angular.extend(this,p("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"})),e.mode="edit",e.saveButtonText=E.instant("common.save.btn"),e.goBack=function(){const r=a((function(){n.history.back()}),100);e.$on("$destroy",(function(){a.cancel(r)}))},e.params=o,e.pageTitle=E.instant("view.edit.user.title",{userId:e.params.userId}),e.passwordPlaceholder=E.instant("security.new.password"),e.userType=s.UserType.USER;const g={DEFAULT_SAMEAS:!0,DEFAULT_INFERENCE:!0,EXECUTE_COUNT:!0,IGNORE_SHARED_QUERIES:!1,DEFAULT_VIS_GRAPH_SCHEMA:!0};c.hasRole(s.UserRole.ROLE_ADMIN)||u.url("settings"),e.getUserData=function(){d.getUser(e.params.userId).success((function(r){e.userData=r,e.user={username:e.userData.username},e.user.password="",e.user.confirmpassword="",e.user.external=e.userData.external,e.user.appSettings=r.appSettings||g,e.userType=s.UserType.USER;const t=i(r.grantedAuthorities);e.userType=t.userType,e.grantedAuthorities=t.grantedAuthorities,e.customRoles=t.customRoles})).error((function(e){const r=getError(e);t.error(r,E.instant("common.error"))}))},e.getUserData(),e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?l.openSimpleModal({title:E.instant("security.save.admin.settings"),message:E.instant("security.admin.pass.unset"),warning:!0}).result.then((function(){e.updateUser()})):e.updateUser()},e.updateUserHttp=function(){e.loader=!0,d.updateUser({username:e.user.username,pass:e.noPassword?"":e.user.password||void 0,appSettings:e.user.appSettings,grantedAuthorities:e.user.grantedAuthorities}).success((function(){t.success(E.instant("security.user.updated",{name:e.user.username}));const r=a((function(){e.loader=!1,n.history.back()}),2e3);e.$on("$destroy",(function(){a.cancel(r)})),c.getPrincipal().then(r=>{e.user.username===r.username&&(r.appSettings=e.user.appSettings)})})).error((function(r){const s=getError(r);e.loader=!1,t.error(s,E.instant("common.error"))}))},e.validateForm=function(){return e.validatePassword()}}]),o.controller("RolesMappingController",["$scope","toastr","SecurityRestService","$translate",function(e,r,t,s){e.debugMapping=function(e,r){const s=r.split(":");t.getRolesMapping({role:e,method:s[1],mapping:s[0]})};e.$on("repositoryIsSet",(function(){t.getRoles().success((function(r){e.roleMappings=r,e.roles=_.keys(e.roleMappings),e.mappings=_.keys(e.roleMappings[e.roles[0]]);const t=_.map(e.roles,(function(r){return[r,_.filter(e.roleMappings[r]).length]}));e.roles=_.reverse(_.map(_.orderBy(t,(function(e){return e[1]})),(function(e){return e[0]})))})).error((function(t){const n=getError(t);e.loader=!1,r.error(n,s.instant("common.error"))}))}))}]),o.controller("ChangeUserPasswordSettingsCtrl",["$scope","toastr","$window","$timeout","$jwtAuth","$rootScope","$controller","SecurityRestService","ModalService","$translate","ThemeService","WorkbenchSettingsStorageService","$q",function(e,r,t,n,o,a,u,c,p,d,l,E,g){angular.extend(this,u("CommonUserCtrl",{$scope:e,passwordPlaceholder:"security.new.password"})),e.themes=l.getThemes(),e.mode="settings",e.showWorkbenchSettings=!0,e.workbenchSettings=E.getWorkbenchSettings(),e.saveButtonText=d.instant("common.save.btn"),e.pageTitle=d.instant("view.settings.title"),e.passwordPlaceholder=d.instant("security.new.password"),e.grantedAuthorities={READ_REPO:{},WRITE_REPO:{}},e.loader=!1,e.selectedTheme=l.getTheme(),e.hasEditRestrictions=function(){return!0},e.isUser=function(){return e.userType===s.UserType.USER},e.goBack=function(){const r=n((function(){t.history.back()}),100);e.$on("$destroy",(function(){n.cancel(r)}))},e.getPrincipal=function(){return o.getPrincipal().then(r=>{e.currentUserData=angular.copy(r)})},e.getPrincipal().then(()=>{e.redirectAdmin(),h(e)}),e.updateCurrentUserData=function(){g.when(o.getPrincipal()).then(r=>_.assign(r,e.userData))},e.redirectAdmin=function(){e.currentUserData||a.redirectToLogin()};const h=function(r){r.userData=angular.copy(r.currentUserData),r.user={username:r.userData.username},r.user.password="",r.user.confirmpassword="",r.user.external=r.userData.external,r.user.appSettings=r.userData.appSettings,void 0===r.user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA&&(r.user.appSettings.DEFAULT_VIS_GRAPH_SCHEMA=!0);const t=i(r.userData.authorities);e.userType=t.userType,e.grantedAuthorities=t.grantedAuthorities,e.customRoles=t.customRoles};e.submit=function(){e.noPassword&&e.userType===s.UserType.ADMIN?p.openSimpleModal({title:d.instant("security.save.admin.settings"),message:d.instant("security.admin.pass.unset"),warning:!0}).result.then((function(){e.updateUser()})):e.updateUser()},e.updateUserHttp=function(){e.loader=!0,c.updateUserData({username:e.user.username,pass:e.noPassword?"":e.user.password||void 0,appSettings:e.user.appSettings}).success((function(){e.updateCurrentUserData(),r.success(d.instant("security.user.updated",{name:e.user.username}));const s=n((function(){e.loader=!1,t.history.back()}),2e3);E.saveWorkbenchSettings(e.workbenchSettings),e.$on("$destroy",(function(){n.cancel(s)}))})).error((function(t){const s=getError(t);e.loader=!1,r.error(s,d.instant("common.error"))}))},e.updateUser=function(){if(!e.validateForm())return!1;e.updateUserHttp()},e.validateForm=function(){return e.validatePassword()},e.setThemeMode=function(){l.toggleThemeMode(e.workbenchSettings.mode)},e.setTheme=r=>{e.selectedTheme=r,e.workbenchSettings.theme=r.name,l.applyTheme(r.name)},e.$on("$destroy",(function(){const e=E.getWorkbenchSettings();l.toggleThemeMode(e.mode)}));e.workbenchSettings||(e.workbenchSettings={theme:"light"}),e.setThemeMode()}]),o.controller("DeleteUserCtrl",["$scope","$uibModalInstance","username",function(e,r,t){e.username=t,e.ok=function(){r.close()},e.cancel=function(){r.dismiss("cancel")}}])}}]);