diff --git a/App_Start/AutoMapperBootstrapper.cs b/App_Start/AutoMapperBootstrapper.cs index aa22c28fed..e4b8285245 100644 --- a/App_Start/AutoMapperBootstrapper.cs +++ b/App_Start/AutoMapperBootstrapper.cs @@ -3,6 +3,7 @@ using System.Linq; using AutoMapper; using Data.Entities; +using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; using Hub.Interfaces; using HubWeb.ViewModels; @@ -20,6 +21,7 @@ public AutoMapperBootStrapper(ITerminal terminal, IActivityTemplate activityTemp _terminal = terminal; _activityTemplate = activityTemplate; } + public void ConfigureAutoMapper() { @@ -28,7 +30,7 @@ public void ConfigureAutoMapper() .ForMember(a => a.Description, opts => opts.ResolveUsing(ad => ad.Description)) .ForMember(a => a.LastUpdated, opts => opts.ResolveUsing(ad => ad.LastUpdated)) .ForMember(a => a.Name, opts => opts.ResolveUsing(ad => ad.Name)) - .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => ad.PlanState)) + .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => PlanState.IntToString(ad.PlanState))) .ForMember(a => a.StartingSubPlanId, opts => opts.ResolveUsing(ad => ad.StartingSubPlanId)) .ForMember(a => a.Tag, opts => opts.ResolveUsing(ad => ad.Tag)) .ForMember(a => a.Visibility, opts => opts.ResolveUsing(ad => new PlanVisibilityDTO() { Hidden = ad.Visibility.BooleanValue() })); @@ -38,7 +40,7 @@ public void ConfigureAutoMapper() .ForMember(a => a.Description, opts => opts.ResolveUsing(ad => ad.Description)) .ForMember(a => a.LastUpdated, opts => opts.ResolveUsing(ad => ad.LastUpdated)) .ForMember(a => a.Name, opts => opts.ResolveUsing(ad => ad.Name)) - .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => ad.PlanState)) + .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => PlanState.StringToInt(ad.PlanState))) .ForMember(a => a.StartingSubPlanId, opts => opts.ResolveUsing(ad => ad.StartingSubPlanId)) .ForMember(a => a.Tag, opts => opts.ResolveUsing(ad => ad.Tag)) .ForMember(a => a.Visibility, opts => opts.ResolveUsing(ad => ad.Visibility?.PlanVisibilityValue())); @@ -46,7 +48,6 @@ public void ConfigureAutoMapper() Mapper.CreateMap().ForMember(a => a.Id, opts => opts.ResolveUsing(ad => ad.Id)) .ForMember(a => a.RootPlanNodeId, opts => opts.ResolveUsing(ad => ad.RootPlanNodeId)) .ForMember(a => a.ParentPlanNodeId, opts => opts.ResolveUsing(ad => ad.ParentPlanNodeId)) - .ForMember(a => a.CurrentView, opts => opts.ResolveUsing(ad => ad.currentView)) .ForMember(a => a.ChildrenActivities, opts => opts.ResolveUsing(ad => ad.ChildNodes.OfType().OrderBy(da => da.Ordering))) .ForMember(a => a.ActivityTemplate, opts => opts.ResolveUsing(GetActivityTemplate)) .ForMember(a => a.AuthToken, opts => opts.ResolveUsing(ad => ad.AuthorizationToken)); @@ -57,7 +58,6 @@ public void ConfigureAutoMapper() //.ForMember(a => a.ActivityTemplate, opts => opts.Ignore()) .ForMember(a => a.ActivityTemplateId, opts => opts.ResolveUsing(GetActivityTemplateId)) //.ForMember(a => a.CrateStorage, opts => opts.ResolveUsing(ad => Newtonsoft.Json.JsonConvert.SerializeObject(ad.CrateStorage))) - .ForMember(a => a.currentView, opts => opts.ResolveUsing(ad => ad.CurrentView)) .ForMember(a => a.ChildNodes, opts => opts.ResolveUsing(ad => MapActivities(ad.ChildrenActivities))) .ForMember(a => a.AuthorizationTokenId, opts => opts.ResolveUsing(ad => ad.AuthToken != null && ad.AuthToken.Id != null ? new Guid(ad.AuthToken.Id) : (Guid?)null)); diff --git a/App_Start/RouteConfig.cs b/App_Start/RouteConfig.cs index a1c022e615..d564b13af1 100644 --- a/App_Start/RouteConfig.cs +++ b/App_Start/RouteConfig.cs @@ -29,6 +29,12 @@ public static void RegisterRoutes(RouteCollection routes) defaults: new { controller = "Redirect", action = "TwilioSMS" } ); + routes.MapRoute( + name: "Plan_Directory", + url: "plan_directory", + defaults: new { controller = "PlanDirectory", action = "Index" } + ); + routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", diff --git a/App_Start/StartupMigration.cs b/App_Start/StartupMigration.cs index 6f94742934..1b0e5472ec 100644 --- a/App_Start/StartupMigration.cs +++ b/App_Start/StartupMigration.cs @@ -4,6 +4,13 @@ using Fr8.Infrastructure.Utilities; using Newtonsoft.Json; using System.Linq; +using AutoMapper; +using Data.Repositories.Encryption; +using Fr8.Infrastructure.Data.Control; +using Fr8.Infrastructure.Data.Crates; +using Fr8.Infrastructure.Data.DataTransferObjects; +using Fr8.Infrastructure.Data.Managers; +using Fr8.Infrastructure.Data.Manifests; namespace HubWeb.App_Start { @@ -13,7 +20,7 @@ public static void CreateSystemUser() { using (var uow = ObjectFactory.GetInstance()) { - var configRepository = ObjectFactory.GetInstance(); + var configRepository = ObjectFactory.GetInstance(); string userEmail = configRepository.Get("SystemUserEmail"); string curPassword = configRepository.Get("SystemUserPassword"); @@ -21,34 +28,51 @@ public static void CreateSystemUser() uow.UserRepository.UpdateUserCredentials(userEmail, userEmail, curPassword); uow.AspNetUserRolesRepository.AssignRoleToUser(Roles.Admin, user.Id); user.TestAccount = false; - + uow.SaveChanges(); } } - //Prior to FR-3683 Salesforce refresh tokens were stored in nonsecure part of database - //This method is intended to save them into key vault - //This method is not a part of Seed method because at that point of time key vault is not yet configured - //TODO: delete this method after this is deployed to prod - public static void MoveSalesforceRefreshTokensIntoKeyVault() + //TODO: this method is a one-time update of transitions inside ContainerTransition control and should be removed after it is deployed to prod + public static void UpdateTransitionNames() { using (var uow = ObjectFactory.GetInstance()) { - var terminalId = uow.TerminalRepository.GetQuery().Where(x => x.Name == "terminalSalesforce").Select(x => x.Id).FirstOrDefault(); - if (terminalId == 0) - { - return; - } - var tokens = uow.AuthorizationTokenRepository.GetPublicDataQuery().Where(x => x.TerminalID == terminalId && x.AdditionalAttributes.StartsWith("refresh_token")); - foreach (var token in tokens) + var encryptionService = ObjectFactory.GetInstance(); + foreach (var activity in uow.PlanRepository + .GetActivityQueryUncached() + .Where(x => x.ActivityTemplate.Name == "Make_a_Decision" && x.ActivityTemplate.Version == "1")) { - var actualToken = uow.AuthorizationTokenRepository.FindTokenById(token.Id); - var refreshTokenFirstIndex = actualToken.AdditionalAttributes.IndexOf('=') + 1; - var refreshTokenLastIndex = actualToken.AdditionalAttributes.IndexOf(';'); - actualToken.Token = JsonConvert.SerializeObject(new { AccessToken = actualToken.Token, RefreshToken = actualToken.AdditionalAttributes.Substring(refreshTokenFirstIndex, refreshTokenLastIndex - refreshTokenFirstIndex) }); - actualToken.AdditionalAttributes = actualToken.AdditionalAttributes.Substring(refreshTokenLastIndex + 1); + + var storage = activity.EncryptedCrateStorage == null || activity.EncryptedCrateStorage.Length == 0 + ? activity.CrateStorage + : encryptionService.DecryptString(activity.Fr8AccountId, activity.EncryptedCrateStorage); + if (string.IsNullOrEmpty(storage)) + { + continue; + } + var crateStorageDto = JsonConvert.DeserializeObject(storage); + var crateStorage = CrateStorageSerializer.Default.ConvertFromDto(crateStorageDto); + var controls = crateStorage.FirstCrateOrDefault()?.Content; + if (controls == null) + { + continue; + } + var transitionList = controls.Controls.OfType().First(); + for (var i = 0; i < transitionList.Transitions.Count; i++) + { + var transition = transitionList.Transitions[i]; + transition.Name = $"transition_{i}"; + } + crateStorageDto = CrateStorageSerializer.Default.ConvertToDto(crateStorage); + storage = JsonConvert.SerializeObject(crateStorageDto, Formatting.Indented); + if (!string.IsNullOrEmpty(activity.CrateStorage)) + { + activity.CrateStorage = storage; + } + activity.EncryptedCrateStorage = encryptionService.EncryptData(activity.Fr8AccountId, storage); + uow.SaveChanges(); } - uow.SaveChanges(); } } } diff --git a/App_Start/SwaggerConfig.cs b/App_Start/SwaggerConfig.cs index cdacfd8032..2af9e7a1c1 100644 --- a/App_Start/SwaggerConfig.cs +++ b/App_Start/SwaggerConfig.cs @@ -4,8 +4,8 @@ using HubWeb; using Swashbuckle.Application; using System.Linq; +using Fr8.Infrastructure.Documentation.Swagger; using HubWeb.Documentation.Swagger; -using HubWeb.Documentation.Swagger.OperationFilters; using Swashbuckle.Swagger; [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")] @@ -180,6 +180,7 @@ public static void Register() //Removing duplicates filter c.DocumentFilter(); c.DocumentFilter(); + c.DocumentFilter(); // In contrast to WebApi, Swagger 2.0 does not include the query string component when mapping a URL // to an action. As a result, Swashbuckle will raise an exception if it encounters multiple actions diff --git a/BuildUtils/xcopy.exe b/BuildUtils/xcopy.exe deleted file mode 100644 index a7720d0b6e..0000000000 Binary files a/BuildUtils/xcopy.exe and /dev/null differ diff --git a/Services/PlanDirectory/CategoryPages/basecamp2.html b/CategoryPages/asana.html similarity index 87% rename from Services/PlanDirectory/CategoryPages/basecamp2.html rename to CategoryPages/asana.html index a1e1bbe0bd..9f6624219a 100644 --- a/Services/PlanDirectory/CategoryPages/basecamp2.html +++ b/CategoryPages/asana.html @@ -20,9 +20,9 @@
-

Plan Directory - basecamp2.html

+

Plan Directory - asana.html

- +

@@ -40,9 +40,9 @@ 1 - Basecamp - Basecamp - Create + UgaChaga + UgaChaga + Create diff --git a/Config/HubWeb/Settings.config.readme b/Config/HubWeb/Settings.config.readme index 5d5e67eac2..fd7d66d434 100644 --- a/Config/HubWeb/Settings.config.readme +++ b/Config/HubWeb/Settings.config.readme @@ -32,6 +32,10 @@ exclude them from .gitignore. + + + + diff --git a/Content/css/dockyard.css b/Content/css/dockyard.css index 1fd721096b..a5e19f35cf 100644 --- a/Content/css/dockyard.css +++ b/Content/css/dockyard.css @@ -111,6 +111,14 @@ padding: 5px 0px 0px 0px } +.black-radio .md-off , .black-radio.md-checked .md-off{ + border-color: black !important; +} +//checked +.black-radio .md-on, .black-radio.md-checked .md-on{ + background-color: black !important; +} + .design-header-title-editField { display: none; font-size: 22px; @@ -484,10 +492,21 @@ div.action-header { right: -66px; } +.jumptarget{ + display: inline-block; + height: 50px; + margin-top: 84px; + max-width:500px; +} + .action-add-button-link { padding: 25px 0 15px 0; } +.action-add-button-disabled { + background: #dcdcdc !important; +} + .action-add-button { background: #fCfCfC; border-radius: 50%; @@ -1541,6 +1560,16 @@ md-radio-button .md-on{ border-radius:50% !important; } + + +.black-radio.md-checked .md-off, .black-radio .md-off { + border-color: rgba(0,0,0,0.87) !important; +} +.black-radio.md-checked .md-on, .black-radio .md-on{ + background-color: rgba(0,0,0,0.87) !important; +} + + md-checkbox.md-checked.green .md-icon { background-color: rgb(38, 166, 154); } diff --git a/Services/PlanDirectory/Content/css/plan-category.css b/Content/css/plan-category.css similarity index 100% rename from Services/PlanDirectory/Content/css/plan-category.css rename to Content/css/plan-category.css diff --git a/Services/PlanDirectory/Content/css/plan-directory.css b/Content/css/plan-directory.css similarity index 98% rename from Services/PlanDirectory/Content/css/plan-directory.css rename to Content/css/plan-directory.css index 1a66c340fc..5ff2677d10 100644 --- a/Services/PlanDirectory/Content/css/plan-directory.css +++ b/Content/css/plan-directory.css @@ -108,6 +108,7 @@ header#site-header:after { /*Search Bar Container*/ .search-bar-container { + width: 100%; text-align: center; display: inline-block; padding: 0 1em; @@ -138,6 +139,7 @@ header#site-header:after { text-align: center; padding: 0 1em; display: inline-block; + width: 100%; } .result-container .base-block-white { diff --git a/Services/PlanDirectory/Content/css/shared/main.css b/Content/css/shared/PlanDirectoryMain.css similarity index 100% rename from Services/PlanDirectory/Content/css/shared/main.css rename to Content/css/shared/PlanDirectoryMain.css diff --git a/Services/PlanDirectory/Content/icons/plus.png b/Content/icons/plus.png similarity index 100% rename from Services/PlanDirectory/Content/icons/plus.png rename to Content/icons/plus.png diff --git a/Services/PlanDirectory/Content/img/plan-bg.jpg b/Content/img/plan-bg.jpg similarity index 100% rename from Services/PlanDirectory/Content/img/plan-bg.jpg rename to Content/img/plan-bg.jpg diff --git a/Services/PlanDirectory/Content/img/white-bg-overlay.png b/Content/img/white-bg-overlay.png similarity index 100% rename from Services/PlanDirectory/Content/img/white-bg-overlay.png rename to Content/img/white-bg-overlay.png diff --git a/Services/PlanDirectory/Content/metronic/components.css b/Content/metronic/components.css similarity index 100% rename from Services/PlanDirectory/Content/metronic/components.css rename to Content/metronic/components.css diff --git a/Services/PlanDirectory/Content/metronic/jquery.blockui.min.js b/Content/metronic/jquery.blockui.min.js similarity index 100% rename from Services/PlanDirectory/Content/metronic/jquery.blockui.min.js rename to Content/metronic/jquery.blockui.min.js diff --git a/Services/PlanDirectory/Content/metronic/loading.gif b/Content/metronic/loading.gif similarity index 100% rename from Services/PlanDirectory/Content/metronic/loading.gif rename to Content/metronic/loading.gif diff --git a/Services/PlanDirectory/Content/metronic/ui.js b/Content/metronic/ui.js similarity index 100% rename from Services/PlanDirectory/Content/metronic/ui.js rename to Content/metronic/ui.js diff --git a/Content/templates/metronic/assets/admin/layout3/scripts/layout.js b/Content/templates/metronic/assets/admin/layout3/scripts/layout.js index c0e7018c16..3de9d90420 100644 --- a/Content/templates/metronic/assets/admin/layout3/scripts/layout.js +++ b/Content/templates/metronic/assets/admin/layout3/scripts/layout.js @@ -98,9 +98,9 @@ var Layout = function () { }); // hold mega menu content open on click/tap. - $(document).on('click', '.mega-menu-dropdown .dropdown-menu, .classic-menu-dropdown .dropdown-menu', function (e) { - e.stopPropagation(); - }); + //$(document).on('click', '.mega-menu-dropdown .dropdown-menu, .classic-menu-dropdown .dropdown-menu', function (e) { + // e.stopPropagation(); + //}); // handle fixed mega menu(minimized) $(window).scroll(function() { diff --git a/Controllers/Api/ActivitiesController.cs b/Controllers/Api/ActivitiesController.cs index d5532d4731..c14f1864ce 100644 --- a/Controllers/Api/ActivitiesController.cs +++ b/Controllers/Api/ActivitiesController.cs @@ -52,7 +52,7 @@ public async Task Create(Guid activityTemplateId, string labe { using (var uow = _uowFactory.Create()) { - if (parentNodeId != null && _planService.GetPlanState(uow, parentNodeId.Value) == PlanState.Running) + if (parentNodeId != null && _planService.IsPlanActiveOrExecuting(parentNodeId.Value)) { return new LockedHttpActionResult(); } @@ -77,12 +77,11 @@ public async Task Create(Guid activityTemplateId, string labe [SwaggerResponse((HttpStatusCode)423, "Specified plan is in running state and 'force' flag is not set so activity can't be configured")] public async Task Configure(ActivityDTO curActionDesignDTO, [FromUri]bool force = false) { - curActionDesignDTO.CurrentView = null; ActivityDO curActivityDO = Mapper.Map(curActionDesignDTO); var userId = User.Identity.GetUserId(); using (var uow = _uowFactory.Create()) { - if (_planService.GetPlanState(uow, curActionDesignDTO.Id) == PlanState.Running && !force) + if (_planService.IsPlanActiveOrExecuting(curActionDesignDTO.Id) && !force) { return new LockedHttpActionResult(); } @@ -130,12 +129,9 @@ public IHttpActionResult Get(Guid id) [SwaggerResponseRemoveDefaults] public async Task Delete([FromUri] Guid id, [FromUri(Name = "delete_child_nodes")] bool deleteChildNodes = false) { - using (var uow = _uowFactory.Create()) + if (_planService.IsPlanActiveOrExecuting(id)) { - if (_planService.GetPlanState(uow, id) == PlanState.Running) - { - return new LockedHttpActionResult(); - } + return new LockedHttpActionResult(); } if (deleteChildNodes) { @@ -162,7 +158,7 @@ public async Task Save(ActivityDTO curActionDTO, [FromUri]boo { using (var uow = _uowFactory.Create()) { - if (_planService.GetPlanState(uow, curActionDTO.Id) == PlanState.Running && !force) + if (_planService.IsPlanActiveOrExecuting(curActionDTO.Id) && !force) { return new LockedHttpActionResult(); } diff --git a/Controllers/Api/ActivityTemplatesController.cs b/Controllers/Api/ActivityTemplatesController.cs index d915cd2e71..8305a3ccbd 100644 --- a/Controllers/Api/ActivityTemplatesController.cs +++ b/Controllers/Api/ActivityTemplatesController.cs @@ -47,6 +47,9 @@ public IHttpActionResult Get() var categoriesWithActivities = _activity.GetAvailableActivityGroups(); return Ok(categoriesWithActivities); } + + + //TODO inspect this - why do we have 2 different methods returning different responses by similar names? /// /// Retreives all available activity templates grouped by category /// diff --git a/Controllers/Api/AlarmsController.cs b/Controllers/Api/AlarmsController.cs index e5a4c4683e..262cb9b2cd 100644 --- a/Controllers/Api/AlarmsController.cs +++ b/Controllers/Api/AlarmsController.cs @@ -107,6 +107,10 @@ private static async Task RenewAuthToken(PollingDataDTO pollingData, strin using (var uow = ObjectFactory.GetInstance()) { var terminalDO = await ObjectFactory.GetInstance().GetByToken(terminalToken); + if (terminalDO == null) + { + throw new Exception("No terminal was found with token: "+terminalToken); + } var token = uow.AuthorizationTokenRepository.FindTokenByExternalAccount(pollingData.ExternalAccountId, terminalDO.Id, pollingData.Fr8AccountId); if (token != null) { diff --git a/Controllers/Api/AuthenticationController.cs b/Controllers/Api/AuthenticationController.cs index 9e930f7db1..835930a7ad 100644 --- a/Controllers/Api/AuthenticationController.cs +++ b/Controllers/Api/AuthenticationController.cs @@ -8,20 +8,18 @@ using System.Web.Http; using Microsoft.AspNet.Identity; using Microsoft.Owin.Security; -using Newtonsoft.Json.Linq; using StructureMap; using Data.Entities; using Data.Interfaces; using Data.Infrastructure.StructureMap; using Fr8.Infrastructure.Data.DataTransferObjects; -using Fr8.Infrastructure.Interfaces; using Fr8.Infrastructure.Utilities.Configuration; using Hub.Infrastructure; using Hub.Interfaces; using HubWeb.Infrastructure_HubWeb; using System.Web.Http.Description; using Fr8.Infrastructure; -using Hub.Services; +using Fr8.Infrastructure.Utilities.Logging; using Newtonsoft.Json; using Swashbuckle.Swagger.Annotations; @@ -80,6 +78,7 @@ public async Task Authenticate(CredentialsDTO credentials) Error = response.Error }); } + /// /// Retrieves URL used as auhtorization url in OAuth authorization scenario /// @@ -114,6 +113,38 @@ public async Task GetOAuthInitiationURL( var externalAuthUrlDTO = await _authorization.GetOAuthInitiationURL(account, terminal); return Ok(new UrlResponseDTO { Url = externalAuthUrlDTO.Url }); } + + /// + /// Returns demo account information for given terminal if system is in Debug or Dev. Otherwise returns null + /// + /// Terminal name + /// Fr8 authentication headers must be provided + /// Receieved demo account information request + [HttpGet] + [Fr8ApiAuthorize] + [ActionName("demoAccountInfo")] + [ResponseType(typeof(InternalDemoAccountDTO))] + public async Task GetDemoCredentials([FromUri(Name = "terminal")] string terminalName) + { +#if DEBUG + var demoUsername = CloudConfigurationManager.GetSetting(terminalName + ".DemoAccountUsername"); + var demoPassword = CloudConfigurationManager.GetSetting(terminalName + ".DemoAccountPassword"); + var docuSignAuthTokenDTO = new InternalDemoAccountDTO() + { + Username = demoUsername, + Password = demoPassword, + Domain = CloudConfigurationManager.GetSetting(terminalName + ".DemoAccountDomain"), + HasDemoAccount = (!String.IsNullOrEmpty(demoUsername) && !String.IsNullOrEmpty(demoPassword)) + }; +#else + var docuSignAuthTokenDTO = new InternalDemoAccountDTO() + { + HasDemoAccount = false + }; +#endif + return Ok(docuSignAuthTokenDTO); + } + /// /// Perform cookie-based authentication on Fr8 Hub. HTTP response will contain authentication cookies /// @@ -127,6 +158,7 @@ public IHttpActionResult Login([FromUri]string username, [FromUri]string passwor { if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) { + Logger.GetLogger().Warn($"Username or password is not specified"); return BadRequest("Username or password is not specified"); } @@ -151,29 +183,11 @@ public IHttpActionResult Login([FromUri]string username, [FromUri]string passwor } } } + Logger.GetLogger().Warn($"Loging failed for {username}"); return StatusCode(HttpStatusCode.Forbidden); } - //Used internally to pass existing authentication to PlanDirectory. Doesn't show up in API listing - - /// - /// Passes existing authentication to PlanDirectory - /// - /// Fr8 authentication headers must be provided - /// Authorization token - /// Unauthorized request - [HttpPost] - [Fr8ApiAuthorize] - [Fr8TerminalAuthentication] - [ResponseType(typeof(TokenWrapper))] - public async Task AuthenticatePlanDirectory() - { - var userId = User.Identity.GetUserId(); - var token = await _planDirectoryService.GetToken(userId); - return Ok(new TokenWrapper { Token = token }); - } - /// /// Updates existing authorization token with new values provided /// @@ -370,7 +384,30 @@ public async Task VerifyPhoneNumberCode(PhoneNumberCredential AuthTokenId = response.AuthorizationToken?.Id.ToString(), Error = response.Error }); - } + } + + [HttpGet] + [ActionName("is_authenticated")] + public IHttpActionResult IsAuthenicated() + { + var authenticated = User.Identity.IsAuthenticated; + return Ok(new { authenticated }); + } + + [HttpGet] + [ActionName("is_privileged")] + public IHttpActionResult IsPrivileged() + { + var identity = User.Identity as ClaimsIdentity; + if (identity == null) + { + return Ok(new { privileged = false }); + } + + var privileged = identity.HasClaim(ClaimsIdentity.DefaultRoleClaimType, "Admin"); + + return Ok(new { privileged }); + } } //This class is purely for Swagger documentation purposes public class TokenWrapper diff --git a/Controllers/Api/ManifestRegistryController.cs b/Controllers/Api/ManifestRegistryController.cs index e5c06abb0e..3382fc8a1b 100644 --- a/Controllers/Api/ManifestRegistryController.cs +++ b/Controllers/Api/ManifestRegistryController.cs @@ -73,7 +73,7 @@ public IHttpActionResult Get() public async Task GetManifestPageUrl(string manifestName) { return Ok(await _restfulServiceClient.PostAsync( - new Uri($"{CloudConfigurationManager.GetSetting("PlanDirectoryUrl")}/api/page_generation/generate_manifest_page"), + new Uri($"{CloudConfigurationManager.GetSetting("PlanDirectoryUrl")}/api/v1/page_generation/generate_manifest_page"), manifestName)); } diff --git a/Services/PlanDirectory/Controllers/Api/PageGenerationController.cs b/Controllers/Api/PageGenerationController.cs similarity index 90% rename from Services/PlanDirectory/Controllers/Api/PageGenerationController.cs rename to Controllers/Api/PageGenerationController.cs index 57ed04f83c..71adb7fd91 100644 --- a/Services/PlanDirectory/Controllers/Api/PageGenerationController.cs +++ b/Controllers/Api/PageGenerationController.cs @@ -1,9 +1,10 @@ using System.Threading.Tasks; using System.Web.Http; -using PlanDirectory.Interfaces; +using Hub.Enums; +using Hub.Interfaces; using StructureMap; -namespace PlanDirectory.Controllers.Api +namespace HubWeb.Controllers.Api { public class PageGenerationController : ApiController { diff --git a/Services/PlanDirectory/Controllers/Api/PlanTemplatesController.cs b/Controllers/Api/PlanTemplatesController.cs similarity index 87% rename from Services/PlanDirectory/Controllers/Api/PlanTemplatesController.cs rename to Controllers/Api/PlanTemplatesController.cs index c60a594d4c..c602f43170 100644 --- a/Services/PlanDirectory/Controllers/Api/PlanTemplatesController.cs +++ b/Controllers/Api/PlanTemplatesController.cs @@ -1,42 +1,42 @@ using System; using System.Net; -using System.Threading.Tasks; using System.Security.Claims; +using System.Threading.Tasks; using System.Web.Http; using Fr8.Infrastructure.Data.DataTransferObjects; +using Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory; using Fr8.Infrastructure.Utilities.Configuration; -using Fr8.Infrastructure.Utilities.Logging; -using Fr8.TerminalBase.Interfaces; -using Microsoft.AspNet.Identity; -using StructureMap; using Hub.Infrastructure; +using Hub.Interfaces; using log4net; +using Microsoft.AspNet.Identity; using PlanDirectory.Infrastructure; -using PlanDirectory.Interfaces; +using StructureMap; -namespace PlanDirectory.Controllers.Api +namespace HubWeb.Controllers.Api { [RoutePrefix("plan_templates")] public class PlanTemplatesController : ApiController { - private readonly IHubCommunicator _hubCommunicator; + //private readonly IHubCommunicator _hubCommunicator; private readonly IPlanTemplate _planTemplate; private readonly ISearchProvider _searchProvider; private readonly IWebservicesPageGenerator _webservicesPageGenerator; + private readonly IPlanDirectoryService _planDirectoryService; private static readonly ILog Logger = LogManager.GetLogger("PlanDirectory"); public PlanTemplatesController() { - var factory = ObjectFactory.GetInstance(); - _hubCommunicator = factory.Create(User.Identity.GetUserId()); + //var factory = ObjectFactory.GetInstance(); + //_hubCommunicator = factory.Create(User.Identity.GetUserId()); _planTemplate = ObjectFactory.GetInstance(); _searchProvider = ObjectFactory.GetInstance(); _webservicesPageGenerator = ObjectFactory.GetInstance(); + _planDirectoryService = ObjectFactory.GetInstance(); } [HttpPost] [Fr8ApiAuthorize] - [PlanDirectoryHMACAuthenticate] public async Task Post(PublishPlanTemplateDTO dto) { var fr8AccountId = User.Identity.GetUserId(); @@ -48,7 +48,6 @@ public async Task Post(PublishPlanTemplateDTO dto) [HttpDelete] [Fr8ApiAuthorize] - [PlanDirectoryHMACAuthenticate] public async Task Delete(Guid id) { var identity = User.Identity as ClaimsIdentity; @@ -72,7 +71,6 @@ public async Task Delete(Guid id) [HttpGet] [Fr8ApiAuthorize] - [PlanDirectoryHMACAuthenticate] public async Task Get(Guid id) { var fr8AccountId = User.Identity.GetUserId(); @@ -99,7 +97,6 @@ public async Task Search( [HttpPost] [Fr8ApiAuthorize] - [PlanDirectoryHMACAuthenticate] public async Task CreatePlan(Guid id) { try @@ -112,12 +109,14 @@ public async Task CreatePlan(Guid id) throw new ApplicationException("Unable to find PlanTemplate in MT-database."); } - var plan = await _hubCommunicator.LoadPlan(planTemplateDTO.PlanContents); + var plan = _planDirectoryService.CreateFromTemplate(planTemplateDTO.PlanContents, User.Identity.GetUserId()); + + //var plan = await _hubCommunicator.LoadPlan(planTemplateDTO.PlanContents); return Ok( new { - RedirectUrl = CloudConfigurationManager.GetSetting("HubApiBaseUrl").Replace("/api/v1/", "") + RedirectUrl = CloudConfigurationManager.GetSetting("HubApiUrl").Replace("/api/v1/", "") + "/dashboard/plans/" + plan.Id.ToString() + "/builder?viewMode=plan" } ); diff --git a/Controllers/Api/PlansController.cs b/Controllers/Api/PlansController.cs index 3bd23c0814..468a95a366 100644 --- a/Controllers/Api/PlansController.cs +++ b/Controllers/Api/PlansController.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Net; using System.Net.Http; +using System.Security.Claims; using System.Web.Http; using System.Web.Http.Description; using AutoMapper; @@ -324,7 +325,8 @@ public async Task Deactivate(Guid planId) _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.ExecutionStopped, - Message = $"\"{plan.Name}\"", + Subject = "Plan Stopped", + Message = $"\"{plan.Name}\" has been stopped.", Collapsed = false }, plan.Fr8AccountId); } @@ -447,7 +449,10 @@ public async Task Share(Guid planId) [SwaggerResponseRemoveDefaults] public async Task Unpublish(Guid planId) { - await _planDirectoryService.Unpublish(planId, User.Identity.GetUserId()); + var identity = User.Identity as ClaimsIdentity; + var privileged = identity.HasClaim(ClaimsIdentity.DefaultRoleClaimType, "Admin"); + + await _planDirectoryService.Unpublish(planId, User.Identity.GetUserId(), privileged); return Ok(); } /// diff --git a/Controllers/Api/TerminalsController.cs b/Controllers/Api/TerminalsController.cs index 24d4d91758..aeb086485a 100644 --- a/Controllers/Api/TerminalsController.cs +++ b/Controllers/Api/TerminalsController.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using System.Web.Http; using AutoMapper; @@ -13,11 +14,18 @@ using System.Web.Http.Description; using Data.Entities; using Swashbuckle.Swagger.Annotations; +using System; +using log4net; +using Microsoft.AspNet.Identity; +using System.Threading; +using Hub.Exceptions; namespace HubWeb.Controllers { public class TerminalsController : ApiController { + private static readonly ILog Logger = Fr8.Infrastructure.Utilities.Logging.Logger.GetCurrentClassLogger(); + private readonly ISecurityServices _security = ObjectFactory.GetInstance(); private readonly ITerminal _terminal = ObjectFactory.GetInstance(); private readonly ITerminalDiscoveryService _terminalDiscovery = ObjectFactory.GetInstance(); @@ -48,13 +56,13 @@ public IHttpActionResult Get() /// Unauthorized request [HttpGet] [Fr8ApiAuthorize] - [ResponseType(typeof(List))] + [ResponseType(typeof(List))] public IHttpActionResult Registrations() { using (var uow = ObjectFactory.GetInstance()) { - var terminals = uow.TerminalRegistrationRepository.GetAll() - .Select(Mapper.Map) + var terminals = uow.TerminalRepository.GetAll() + .Select(Mapper.Map) .ToList(); @@ -86,11 +94,11 @@ public IHttpActionResult All() [HttpGet] [Fr8ApiAuthorize] [ResponseType(typeof(TerminalDTO))] - public IHttpActionResult Get(int id) + public IHttpActionResult Get(Guid id) { var terminalDTO = Mapper.Map(_terminal.GetByKey(id)); - terminalDTO.Roles = _security.GetAllowedUserRolesForSecuredObject(id.ToString(), nameof(TerminalDO)); + terminalDTO.Roles = _security.GetAllowedUserRolesForSecuredObject(id, nameof(TerminalDO)); return Ok(terminalDTO); } @@ -98,14 +106,39 @@ public IHttpActionResult Get(int id) /// /// Registers terminal endpoint in the current hub and performs initial terminal discovery process using this endpoint /// - /// Terminal endpoint + /// Terminal endpoint [HttpPost] //[Fr8ApiAuthorize] - [SwaggerResponse(HttpStatusCode.OK, "Terminal was registered and discovery process was successfully performed")] + [SwaggerResponse(HttpStatusCode.OK, "Terminal has been registered and discovery process has been successfully performed.")] [SwaggerResponseRemoveDefaults] - public async Task Post([FromBody]TerminalRegistrationDTO registration) + public async Task Post([FromBody]TerminalDTO terminal) { - await _terminalDiscovery.RegisterTerminal(registration.Endpoint); + try + { + await _terminalDiscovery.SaveOrRegister(terminal); + } + catch (ArgumentNullException) + { + return BadRequest("An error has occurred while validating terminal data. Please make sure that the form fields are filled out correctly."); + } + catch (ArgumentOutOfRangeException) + { + return NotFound(); + } + catch (InvalidOperationException) + { + return BadRequest("Terminal URL cannot contain the string 'localhost'. Please correct your terminal URL and try again."); + } + catch (ConflictException) + { + return Conflict(); + } + catch (Exception ex) + { + var username = Thread.CurrentPrincipal.Identity.GetUserName(); + Logger.Error($"An error has occurred while adding user's terminal on the Terminal's page. Terminal DevURL: {terminal.DevUrl}, ProdURL: {terminal.ProdUrl}, Username: {username}"); + return InternalServerError(); + } return Ok(); } /// @@ -117,7 +150,13 @@ public async Task Post([FromBody]TerminalRegistrationDTO regi [ResponseType(typeof(ResponseMessageDTO))] public async Task ForceDiscover([FromBody] string callbackUrl) { - if (!await _terminalDiscovery.Discover(callbackUrl)) + if (string.IsNullOrEmpty(callbackUrl)) + { + Logger.Error($"A terminal has submitted the /forcediscovery request with an empty callbackUrl."); + return ErrorDTO.InternalError("Request failed: the callbackUrl parameter was expected but is null."); + } + + if (!await _terminalDiscovery.Discover(callbackUrl, false)) { return ErrorDTO.InternalError($"Failed to call /discover for enpoint {callbackUrl}"); } diff --git a/Controllers/Api/UsersController.cs b/Controllers/Api/UsersController.cs index f35c144d73..4c38692b73 100644 --- a/Controllers/Api/UsersController.cs +++ b/Controllers/Api/UsersController.cs @@ -18,6 +18,7 @@ using StructureMap; using System.Web.Http.Description; using Swashbuckle.Swagger.Annotations; +using WebApi.OutputCache.V2; namespace HubWeb.Controllers { @@ -162,6 +163,7 @@ public IHttpActionResult Update(string oldPassword, string newPassword) } return Ok(); } + /// /// Updates user info /// @@ -201,6 +203,32 @@ public IHttpActionResult UpdateUserProfile(UserDTO userDTO) return Ok(); } + /// + /// Checks if User has the specified permission for the specified object. + /// + /// + /// User must be logged in + /// + /// Class name to check permissions against (e.g. TerminalDO, PlanNodeDO, etc). + /// The permission to check. + /// Current user Id. + [HttpGet] + [SwaggerResponse(HttpStatusCode.OK, "true if the current user has the specified permission, and false if not.")] + [SwaggerResponseRemoveDefaults] + [CacheOutput(ServerTimeSpan = 300, ClientTimeSpan = 300, ExcludeQueryStringFromCacheKey = false)] + public IHttpActionResult CheckPermission(string userId, PermissionType permissionType, string objectType) + { + // Check that the correct userid is supplied. + // We need User to provide User Id in order to return the correct cached value. + // Otherwise all users would receive the same cached value. + if (userId != _securityServices.GetCurrentUser()) + { + return BadRequest("User Id does not correspond to the current user identity."); + } + + return Ok(_securityServices.UserHasPermission(permissionType, objectType)); + } + #endregion #region Helper Methods @@ -286,4 +314,4 @@ public void UpdateStatus(string userId, int status) #endregion } -} \ No newline at end of file +} diff --git a/Controllers/Api/WebServicesController.cs b/Controllers/Api/WebServicesController.cs index 42fe98104a..7dd599f1f9 100644 --- a/Controllers/Api/WebServicesController.cs +++ b/Controllers/Api/WebServicesController.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Data.Entity; using System.Linq; using System.Net; using System.Web.Http; @@ -28,96 +30,173 @@ public WebServicesController() _fr8Account = ObjectFactory.GetInstance(); _activityTemplate = ObjectFactory.GetInstance(); } + /// /// Retrieves collection of web services which contain activities of specified category. If category is not specified returns list of web servies only /// /// Id of activity category. 1 - Monitors, 2 - Receivers, 3 - Processors, 4 - Forwarders, 5 - Solutions + // [HttpGet] + // [SwaggerResponse(HttpStatusCode.OK, "Collection of web services including activity templates", typeof(List))] + // public IHttpActionResult Get(int id = -1) + // { + // if (id >= 0) + // { + // var category = (Fr8.Infrastructure.Data.States.ActivityCategory)id; + // List webServiceList; + // + // using (var uow = ObjectFactory.GetInstance()) + // { + // // Getting web services and their actions as one set, then filtering that set + // // to get only those actions whose category matches any of categories provided + // // resulting set is grouped into batches 1 x web service - n x actions + // + // var unknwonService = uow.WebServiceRepository.GetQuery().FirstOrDefault(x => x.Name == UknownWebServiceName); + // + // var activityTemplate = _activityTemplate.GetQuery() + // .Where(x => x.ActivityTemplateState == ActivityTemplateState.Active) + // .Where(x => id == 0 || category == x.Category) + // .Where(x => x.Tags == null || (!x.Tags.Contains(Tags.Internal) || _fr8Account.IsCurrentUserInAdminRole())); + // + // webServiceList = activityTemplate + // .GroupBy(x => x.WebService, x => x, (key, group) => new + // { + // WebService = key, + // SortOrder = key == null ? 1 : 0, + // Actions = group + // }).OrderBy(x => x.SortOrder) + // .Select(x => new WebServiceActivitySetDTO + // { + // WebServiceIconPath = x.WebService != null ? x.WebService.IconPath : (unknwonService != null ? unknwonService.IconPath : null), + // WebServiceName = x.WebService != null ? x.WebService.Name : string.Empty, + // Activities = x.Actions + // .GroupBy(y => y.Name) + // .Select(y => y.OrderByDescending(z => int.Parse(z.Version)).First()) + // .Select(p => new ActivityTemplateDTO + // { + // Id = p.Id, + // Name = p.Name, + // Category = p.Category, + // Label = p.Label, + // MinPaneWidth = p.MinPaneWidth, + // Version = p.Version, + // Type = p.Type, + // Tags = p.Tags, + // WebService = Mapper.Map(p.WebService), + // Terminal = Mapper.Map(p.Terminal) + // }).ToList() + // }).ToList(); + // } + // + // return Ok(webServiceList); + // } + // + // // If there is no category + // using (var uow = ObjectFactory.GetInstance()) + // { + // var models = uow.WebServiceRepository + // .GetAll() + // .Select(Mapper.Map) + // .ToList(); + // return Ok(models); + // } + // } + [HttpGet] [SwaggerResponse(HttpStatusCode.OK, "Collection of web services including activity templates", typeof(List))] - public IHttpActionResult Get(int id = -1) + public IHttpActionResult Get(Guid? id = null) { - if (id >= 0) + using (var uow = ObjectFactory.GetInstance()) { - var category = (Fr8.Infrastructure.Data.States.ActivityCategory)id; - List webServiceList; - - using (var uow = ObjectFactory.GetInstance()) + if (id.HasValue) { - // Getting web services and their actions as one set, then filtering that set - // to get only those actions whose category matches any of categories provided - // resulting set is grouped into batches 1 x web service - n x actions - - var unknwonService = uow.WebServiceRepository.GetQuery().FirstOrDefault(x => x.Name == UknownWebServiceName); + if (!ActivityCategories.ActivityCategoryIds.Contains(id.Value)) + { + throw new ApplicationException("Invalid predefined activity category"); + } - var activityTemplate = _activityTemplate.GetQuery() - .Where(x => x.ActivityTemplateState == ActivityTemplateState.Active) - .Where(x => id == 0 || category == x.Category) - .Where(x => x.Tags == null || (!x.Tags.Contains(Tags.Internal) || _fr8Account.IsCurrentUserInAdminRole())); + var idValue = id.Value; + var activityTemplates = uow + .ActivityTemplateRepository + .GetQuery() + .Include("Categories.ActivityCategory") + .Where(x => x.Categories.Any(y => y.ActivityCategoryId == idValue)) + .ToList(); - webServiceList = activityTemplate - .GroupBy(x => x.WebService, x => x, (key, group) => new - { - WebService = key, - SortOrder = key == null ? 1 : 0, - Actions = group - }).OrderBy(x => x.SortOrder) - .Select(x => new WebServiceActivitySetDTO + var categorySet = new HashSet(); + foreach (var category in activityTemplates.SelectMany(x => x.Categories).Select(x => x.ActivityCategory)) { - WebServiceIconPath = x.WebService != null ? x.WebService.IconPath : (unknwonService != null ? unknwonService.IconPath : null), - WebServiceName = x.WebService != null ? x.WebService.Name : string.Empty, - Activities = x.Actions - .GroupBy(y => y.Name) - .Select(y => y.OrderByDescending(z => int.Parse(z.Version)).First()) - .Select(p => new ActivityTemplateDTO - { - Id = p.Id, - Name = p.Name, - Category = p.Category, - Label = p.Label, - MinPaneWidth = p.MinPaneWidth, - Version = p.Version, - Type = p.Type, - Tags = p.Tags, - WebService = Mapper.Map(p.WebService), - Terminal = Mapper.Map(p.Terminal) - }).ToList() - }).ToList(); - } + if (ActivityCategories.ActivityCategoryIds.Contains(category.Id)) + { + continue; + } - return Ok(webServiceList); - } + categorySet.Add(category); + } - // If there is no category - using (var uow = ObjectFactory.GetInstance()) - { - var models = uow.WebServiceRepository - .GetAll() - .Select(Mapper.Map) - .ToList(); - return Ok(models); + var result = categorySet + .OrderBy(x => x.Name) + .Select(x => new WebServiceActivitySetDTO() + { + WebServiceName = x.Name, + WebServiceIconPath = x.IconPath, + Activities = activityTemplates + .Where(y => y.Categories.Any(z => z.ActivityCategoryId == x.Id)) + .GroupBy(y => new { y.Name }) + .Select(y => Mapper.Map(y.OrderByDescending(z => int.Parse(z.Version)).First())) + .ToList() + }) + .ToList(); + + return Ok(result); + } + else + { + var models = uow.ActivityCategoryRepository + .GetAll() + .Select(Mapper.Map) + .ToList(); + + return Ok(models); + } } } + /// /// Creates web service with specified data /// /// Web service data to create web service from /// Web service was successfully saved [HttpPost] - [ResponseType(typeof(WebServiceDTO))] - public IHttpActionResult Post(WebServiceDTO webService) + [ResponseType(typeof(ActivityCategoryDTO))] + public IHttpActionResult Post(ActivityCategoryDTO category) { - WebServiceDO entity = Mapper.Map(webService); - using (var uow = ObjectFactory.GetInstance()) { - uow.WebServiceRepository.Add(entity); + var existingCategory = uow.ActivityCategoryRepository + .GetQuery() + .Where(x => x.Name == category.Name) + .FirstOrDefault(); - uow.SaveChanges(); - } + ActivityCategoryDTO model; + + if (existingCategory != null) + { + existingCategory.IconPath = category.IconPath; + model = Mapper.Map(existingCategory); + } + else + { + var entity = Mapper.Map(category); + entity.Id = Guid.NewGuid(); - var model = Mapper.Map(entity); + uow.ActivityCategoryRepository.Add(entity); + model = Mapper.Map(entity); + } - return Ok(model); + uow.SaveChanges(); + + return Ok(model); + } } } } \ No newline at end of file diff --git a/Controllers/DockyardAccountController.cs b/Controllers/DockyardAccountController.cs index 129f16a5d2..e950eb1b3e 100644 --- a/Controllers/DockyardAccountController.cs +++ b/Controllers/DockyardAccountController.cs @@ -15,6 +15,7 @@ using HubWeb.ViewModels; using Microsoft.AspNet.Identity; using StructureMap; +using HubWeb.Filters; namespace HubWeb.Controllers { @@ -32,6 +33,7 @@ public DockyardAccountController() _planDirectory = ObjectFactory.GetInstance(); } + [RedirecLogedUser] [AllowAnonymous] public ActionResult InterceptLogin(string returnUrl, string urlReferrer) { @@ -42,6 +44,7 @@ public ActionResult InterceptLogin(string returnUrl, string urlReferrer) return View("Index"); } + [RedirecLogedUser] [AllowAnonymous] public ActionResult AccessDenied(string errorMessage) { @@ -50,6 +53,7 @@ public ActionResult AccessDenied(string errorMessage) return View(); } + [RedirecLogedUser] [AllowAnonymous] public ActionResult Index(string returnUrl) { @@ -57,6 +61,7 @@ public ActionResult Index(string returnUrl) return View(); } + [RedirecLogedUser] [AllowAnonymous] public ActionResult Register() { @@ -64,6 +69,7 @@ public ActionResult Register() return View(); } + [RedirecLogedUser] [AllowAnonymous] public ActionResult RegistrationSuccessful() { @@ -76,13 +82,15 @@ public async Task LogOff() this.Logout(); return RedirectToAction("Index"); } - + + [RedirecLogedUser] [AllowAnonymous] public ActionResult Confirm(RegistrationVM model) { return View(model); } + [RedirecLogedUser] [HttpPost] [AllowAnonymous] #if !DEBUG @@ -147,6 +155,7 @@ public async Task ProcessRegistration(RegistrationVM submittedRegD return View("Register"); } + [RedirecLogedUser] [HttpPost] [AllowAnonymous] #if !DEBUG @@ -211,7 +220,7 @@ public async Task Login(LoginVM model, string returnUrl) return View("Index", model); } - + [RedirecLogedUser] [HttpGet] [AllowAnonymous] public ActionResult ConfirmEmail(string userId, string code) @@ -237,6 +246,7 @@ public ActionResult ConfirmEmail(string userId, string code) return RedirectToAction("Index", "Welcome"); } + [RedirecLogedUser] [System.Web.Http.HttpPost] public ActionResult Edit(UserVM usersAdminVM) { @@ -263,6 +273,7 @@ public ActionResult Edit(UserVM usersAdminVM) } } + [RedirecLogedUser] [HttpGet] [AllowAnonymous] public ActionResult ForgotPassword() @@ -270,6 +281,7 @@ public ActionResult ForgotPassword() return View(); } + [RedirecLogedUser] [HttpPost] [AllowAnonymous] public async Task ForgotPassword(ForgotPasswordVM model) @@ -293,6 +305,7 @@ public async Task ForgotPassword(ForgotPasswordVM model) return View(model); } + [RedirecLogedUser] [HttpGet] [AllowAnonymous] public ActionResult ResetPassword(string userId, string code) @@ -312,6 +325,7 @@ public ActionResult ResetPassword(string userId, string code) } } + [RedirecLogedUser] [HttpPost] [AllowAnonymous] public async Task ResetPassword(ResetPasswordVM viewModel) @@ -346,6 +360,7 @@ public async Task ResetPassword(ResetPasswordVM viewModel) return View(viewModel); } + [RedirecLogedUser] public RedirectToRouteResult RegisterGuestUser() { TempData["tempEmail"] = User.Identity.Name; @@ -353,6 +368,7 @@ public RedirectToRouteResult RegisterGuestUser() return RedirectToAction("Register"); } + [RedirecLogedUser] [AllowAnonymous] public async Task ProcessGuestUserMode() { diff --git a/Controllers/PlanDirectoryController.cs b/Controllers/PlanDirectoryController.cs new file mode 100644 index 0000000000..d1dd2a439f --- /dev/null +++ b/Controllers/PlanDirectoryController.cs @@ -0,0 +1,15 @@ +using System.Web.Mvc; + +namespace HubWeb.Controllers +{ + + public class PlanDirectoryController : Controller + { + + [HttpGet] + public ActionResult Index() + { + return View(); + } + } +} diff --git a/Data/App.config b/Data/App.config index c59a831546..9106b31015 100644 --- a/Data/App.config +++ b/Data/App.config @@ -69,6 +69,6 @@ - + diff --git a/Data/Data.csproj b/Data/Data.csproj index 6867cafe78..9e7d383c38 100644 --- a/Data/Data.csproj +++ b/Data/Data.csproj @@ -262,9 +262,7 @@ - - @@ -747,6 +745,10 @@ 201607271152557_FixManifestDescriptionTypos.cs + + + 201607241524205_Terminals_Standard_Permissions.cs + 201607291915038_RemovePlanTemplateEntities.cs @@ -771,6 +773,38 @@ 201608021530462_RemoveRunnable.cs + + + 201608030857168_RemovedNameAndCurrentViewFromActivityDO.cs + + + + 201608071558594_DiscoveryRefactoring.cs + + + + 201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.cs + + + + 201608091020235_FixUp_Migration_2.cs + + + + 201608091306036_ConvertedTerminalIdToGuid.cs + + + + 201608091310148_ConvertMtDataIdToGuid.cs + + + + 201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.cs + + + + 201608092230355_OperationalState1.cs + @@ -875,13 +909,13 @@ - - + + @@ -908,7 +942,7 @@ - + @@ -926,6 +960,8 @@ + + @@ -1042,6 +1078,7 @@ Designer + Designer @@ -1401,6 +1438,9 @@ 201607271152557_FixManifestDescriptionTypos.cs + + 201607241524205_Terminals_Standard_Permissions.cs + 201607291915038_RemovePlanTemplateEntities.cs @@ -1419,6 +1459,30 @@ 201608021530462_RemoveRunnable.cs + + 201608030857168_RemovedNameAndCurrentViewFromActivityDO.cs + + + 201608071558594_DiscoveryRefactoring.cs + + + 201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.cs + + + 201608091020235_FixUp_Migration_2.cs + + + 201608091306036_ConvertedTerminalIdToGuid.cs + + + 201608091310148_ConvertMtDataIdToGuid.cs + + + 201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.cs + + + 201608092230355_OperationalState1.cs + diff --git a/Data/Entities/ActivityCategoryDO.cs b/Data/Entities/ActivityCategoryDO.cs index 8e398caefe..b9999d125b 100644 --- a/Data/Entities/ActivityCategoryDO.cs +++ b/Data/Entities/ActivityCategoryDO.cs @@ -11,5 +11,23 @@ public class ActivityCategoryDO : BaseObject [MaxLength(200)] public string Name { get; set; } public string IconPath { get; set; } + + protected bool Equals(ActivityCategoryDO other) + { + return Id == other.Id; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != this.GetType()) return false; + return Equals((ActivityCategoryDO) obj); + } + + public override int GetHashCode() + { + return Id.GetHashCode(); + } } } diff --git a/Data/Entities/ActivityDO.cs b/Data/Entities/ActivityDO.cs index 348a014f52..f50ed69e0c 100644 --- a/Data/Entities/ActivityDO.cs +++ b/Data/Entities/ActivityDO.cs @@ -14,15 +14,12 @@ public class ActivityDO : PlanNodeDO public string CrateStorage { get; set; } public string Label { get; set; } - public string Name { get; set; } [ForeignKey("ActivityTemplate")] public Guid ActivityTemplateId { get; set; } public virtual ActivityTemplateDO ActivityTemplate { get; set; } - public string currentView { get; set; } - [ForeignKey("AuthorizationToken")] public Guid? AuthorizationTokenId { get; set; } @@ -64,11 +61,9 @@ protected override void CopyProperties(PlanNodeDO source) base.CopyProperties(source); Label = activity.Label; - Name = activity.Name; CrateStorage = activity.CrateStorage; AuthorizationTokenId = activity.AuthorizationTokenId; ActivityTemplateId = activity.ActivityTemplateId; - currentView = activity.currentView; ActivationState = activity.ActivationState; } } diff --git a/Data/Entities/ActivityTemplateDO.cs b/Data/Entities/ActivityTemplateDO.cs index d048410fbf..efec78ae01 100644 --- a/Data/Entities/ActivityTemplateDO.cs +++ b/Data/Entities/ActivityTemplateDO.cs @@ -16,7 +16,7 @@ public ActivityTemplateDO() this.NeedsAuthentication = false; } - public ActivityTemplateDO(string name, string label, string version, string description, int terminalId, ActivityType type = ActivityType.Standard) : this() + public ActivityTemplateDO(string name, string label, string version, string description, Guid terminalId, ActivityType type = ActivityType.Standard) : this() { this.Name = name; this.Label = label; @@ -78,13 +78,10 @@ public ActivityTemplateDO(string name, string version, public _ActivityTemplateStateTemplate ActivityTemplateStateTemplate { get; set; } [ForeignKey("Terminal")] - public int TerminalId { get; set; } + public Guid TerminalId { get; set; } public virtual TerminalDO Terminal { get; set; } - [Required] - public ActivityCategory Category { get; set; } - [Required] public ActivityType Type { get; set; } @@ -92,10 +89,5 @@ public ActivityTemplateDO(string name, string version, public virtual IList Categories { get; set; } public int MinPaneWidth { get; set; } - - [ForeignKey("WebService")] - public int? WebServiceId { get; set; } - - public virtual WebServiceDO WebService { get; set; } } } diff --git a/Data/Entities/AuthorizationTokenDO.cs b/Data/Entities/AuthorizationTokenDO.cs index 92ae9ad6f0..54bc2ad20b 100644 --- a/Data/Entities/AuthorizationTokenDO.cs +++ b/Data/Entities/AuthorizationTokenDO.cs @@ -59,7 +59,7 @@ public AuthorizationTokenDO() public Fr8AccountDO UserDO { get; set; } [ForeignKey("Terminal")] - public int TerminalID { get; set; } + public Guid TerminalID { get; set; } // Authorization tokens are cached. We can't make lazy loading work in this case so disable it. // If you need Terminal resolve it using ITerminal service and TerminalID property. public TerminalDO Terminal { get; set; } diff --git a/Data/Entities/ContainerDO.cs b/Data/Entities/ContainerDO.cs index 695c2a4f8f..65681596e0 100644 --- a/Data/Entities/ContainerDO.cs +++ b/Data/Entities/ContainerDO.cs @@ -60,7 +60,7 @@ public override void AfterCreate() base.AfterCreate(); var securityService = ObjectFactory.GetInstance(); - securityService.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, Id.ToString(), GetType().Name); + securityService.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, Id, GetType().Name); } } } \ No newline at end of file diff --git a/Data/Entities/PlanNodeDO.cs b/Data/Entities/PlanNodeDO.cs index 32c4f1dcbc..c361f6a95e 100644 --- a/Data/Entities/PlanNodeDO.cs +++ b/Data/Entities/PlanNodeDO.cs @@ -116,7 +116,7 @@ public override void AfterCreate() base.AfterCreate(); var securityService = ObjectFactory.GetInstance(); - securityService.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, Id.ToString(), nameof(PlanNodeDO)); + securityService.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, Id, nameof(PlanNodeDO)); } public List GetDescendantsOrdered() diff --git a/Data/Entities/SubscriptionDO.cs b/Data/Entities/SubscriptionDO.cs index a0a915e0e0..43427ed04d 100644 --- a/Data/Entities/SubscriptionDO.cs +++ b/Data/Entities/SubscriptionDO.cs @@ -20,7 +20,7 @@ public class SubscriptionDO : BaseObject, ISubscriptionDO public virtual Fr8AccountDO DockyardAccount { get; set; } [ForeignKey("Terminal")] - public int TerminalId { get; set; } + public Guid TerminalId { get; set; } public virtual TerminalDO Terminal { get; set; } [ForeignKey("AccessLevelTemplate")] diff --git a/Data/Entities/TerminalDO.cs b/Data/Entities/TerminalDO.cs index 01a776f2fd..6091cf4a58 100644 --- a/Data/Entities/TerminalDO.cs +++ b/Data/Entities/TerminalDO.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using System; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Data.Interfaces; using Data.States.Templates; @@ -13,38 +14,62 @@ public TerminalDO() } [Key] - public int Id { get; set; } + public Guid Id { get; set; } public string Secret { get; set; } - [Required] public string Name { get; set; } - [Required] public string Version { get; set; } - [Required] public string Label { get; set; } [ForeignKey("TerminalStatusTemplate")] public int TerminalStatus { get; set; } public _TerminalStatusTemplate TerminalStatusTemplate { get; set; } - // TODO: remove this, DO-1397 - // public bool RequiresAuthentication { get; set; } - - //public string BaseEndPoint { get; set; } - + /// + /// Currently active endpoint. + /// + /// + /// The 'Endpoint' property contains the currently active endpoint which may be changed + /// by deployment scripts or by promoting the terminal from Dev to Production + /// while ProdUrl/DevUrl contains whatever user or administrator have supplied. + /// + [Required] public string Endpoint { get; set; } public virtual Fr8AccountDO UserDO { get; set; } + [ForeignKey("UserDO")] + public string UserId { get; set; } public string Description { get; set; } - [Required] [ForeignKey("AuthenticationTypeTemplate")] public int AuthenticationType { get; set; } public virtual _AuthenticationTypeTemplate AuthenticationTypeTemplate { get; set; } + + public bool IsFr8OwnTerminal { get; set; } + + /// + /// Development endpoint URL. + /// + public string DevUrl { get; set; } + + /// + /// Production endpoint URL. + /// + public string ProdUrl { get; set; } + + [ForeignKey("ParticipationStateTemplate")] + public int ParticipationState { get; set; } + public virtual _ParticipationStateTemplate ParticipationStateTemplate { get; set; } + + [Required] + [ForeignKey("OperationalStateTemplate")] + public int OperationalState { get; set; } + public virtual _OperationalStateTemplate OperationalStateTemplate { get; set; } + } } diff --git a/Data/Entities/TerminalRegistrationDO.cs b/Data/Entities/TerminalRegistrationDO.cs deleted file mode 100644 index 91a0834fa2..0000000000 --- a/Data/Entities/TerminalRegistrationDO.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace Data.Entities -{ - public class TerminalRegistrationDO : BaseObject - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public string Endpoint { get; set; } - - [ForeignKey("User")] - public String UserId { get; set; } - public Fr8AccountDO User { get; set; } - public bool IsFr8OwnTerminal { get; set; } - } -} diff --git a/Data/Entities/TerminalSubscriptionDO.cs b/Data/Entities/TerminalSubscriptionDO.cs index b415f1c7f3..627465419f 100644 --- a/Data/Entities/TerminalSubscriptionDO.cs +++ b/Data/Entities/TerminalSubscriptionDO.cs @@ -20,7 +20,7 @@ public TerminalSubscriptionDO() public int Id { get; set; } [ForeignKey("Terminal")] - public int TerminalId { get; set; } + public Guid TerminalId { get; set; } public virtual TerminalDO Terminal { get; set; } [Required] diff --git a/Data/Entities/WebServiceDO.cs b/Data/Entities/WebServiceDO.cs deleted file mode 100644 index 3cc2389dcc..0000000000 --- a/Data/Entities/WebServiceDO.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace Data.Entities -{ - public class WebServiceDO : BaseObject - { - [Key] - public int Id { get; set; } - public string Name { get; set; } - public string IconPath { get; set; } - - protected bool Equals(WebServiceDO other) - { - return Id == other.Id; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != this.GetType()) return false; - return Equals((WebServiceDO) obj); - } - - public override int GetHashCode() - { - return Id; - } - } -} \ No newline at end of file diff --git a/Data/Infrastructure/AutoMapper/DataAutoMapperBootstrapper.cs b/Data/Infrastructure/AutoMapper/DataAutoMapperBootstrapper.cs index cb7c1d4909..6c71a4e97f 100644 --- a/Data/Infrastructure/AutoMapper/DataAutoMapperBootstrapper.cs +++ b/Data/Infrastructure/AutoMapper/DataAutoMapperBootstrapper.cs @@ -32,10 +32,6 @@ public static void ConfigureAutoMapper() .ForMember(dto => dto.EmailAddress, opts => opts.ResolveUsing(e => e.EmailAddress.Address)) .ForMember(dto => dto.Status, opts => opts.ResolveUsing(e => e.State.Value)); - Mapper.CreateMap(); - Mapper.CreateMap() - .ForMember(x => x.LastUpdated, opts => opts.Ignore()) - .ForMember(x => x.CreateDate, opts => opts.Ignore()); Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap().ConvertUsing(); @@ -43,7 +39,6 @@ public static void ConfigureAutoMapper() .ForMember(a => a.RootPlanNodeId, opts => opts.ResolveUsing(ad => ad.RootPlanNodeId)) .ForMember(a => a.ParentPlanNodeId, opts => opts.ResolveUsing(ad => ad.ParentPlanNodeId)) //.ForMember(a => a.CrateStorage, opts => opts.ResolveUsing(ad => ad.CrateStorage == null ? null : JsonConvert.DeserializeObject(ad.CrateStorage))) - .ForMember(a => a.CurrentView, opts => opts.ResolveUsing(ad => ad.currentView)) .ForMember(a => a.ChildrenActivities, opts => opts.ResolveUsing(ad => ad.ChildNodes.OfType().OrderBy(da => da.Ordering))) .ForMember(a => a.ActivityTemplate, opts => opts.ResolveUsing(ad => ad.ActivityTemplate)) .ForMember(a => a.AuthToken, opts => opts.ResolveUsing(ad => ad.AuthorizationToken)) @@ -64,7 +59,6 @@ public static void ConfigureAutoMapper() } })) //.ForMember(a => a.CrateStorage, opts => opts.ResolveUsing(ad => Newtonsoft.Json.JsonConvert.SerializeObject(ad.CrateStorage))) - .ForMember(a => a.currentView, opts => opts.ResolveUsing(ad => ad.CurrentView)) .ForMember(a => a.ChildNodes, opts => opts.ResolveUsing(ad => MapActivities(ad.ChildrenActivities))) .ForMember(a => a.AuthorizationTokenId, opts => opts.ResolveUsing(ad => ad.AuthToken != null && ad.AuthToken.Id != null ? new Guid(ad.AuthToken.Id) : (Guid?) null)); @@ -74,12 +68,16 @@ public static void ConfigureAutoMapper() .ForMember(x => x.TerminalName, opts => opts.ResolveUsing(x => x.Terminal.Name)) .ForMember(x => x.TerminalVersion, opts => opts.ResolveUsing(x => x.Terminal.Version)); + Mapper.CreateMap(); + Mapper.CreateMap(); + Mapper.CreateMap() .ForMember(x => x.Id, opts => opts.ResolveUsing(x => x.Id)) .ForMember(x => x.Name, opts => opts.ResolveUsing(x => x.Name)) .ForMember(x => x.Version, opts => opts.ResolveUsing(x => x.Version)) .ForMember(x => x.NeedsAuthentication, opts => opts.ResolveUsing(x => x.NeedsAuthentication)) .ForMember(x => x.ShowDocumentation, opts => opts.Ignore()) + .ForMember(x => x.Description, opts => opts.ResolveUsing(x => x.Description)) .ForMember( x => x.Categories, opts => opts.ResolveUsing((ActivityTemplateDO x) => @@ -88,6 +86,7 @@ public static void ConfigureAutoMapper() .Where(y => y.ActivityCategory != null) .Select(y => new ActivityCategoryDTO() { + Id = y.ActivityCategory.Id, Name = y.ActivityCategory.Name, IconPath = y.ActivityCategory.IconPath }) @@ -101,13 +100,11 @@ public static void ConfigureAutoMapper() .ForMember(x => x.Name, opts => opts.ResolveUsing(x => x.Name)) .ForMember(x => x.Version, opts => opts.ResolveUsing(x => x.Version)) .ForMember(x => x.Terminal, opts => opts.ResolveUsing(x => x.Terminal)) - // .ForMember(x => x.AuthenticationType, opts => opts.ResolveUsing(x => x.AuthenticationType)) - .ForMember(x => x.WebService, opts => opts.ResolveUsing(x => Mapper.Map(x.WebService))) + // .ForMember(x => x.AuthenticationType, opts => opts.ResolveUsing(x => x.AuthenticationType)) // .ForMember(x => x.AuthenticationTypeTemplate, opts => opts.ResolveUsing((ActivityTemplateDTO x) => null)) .ForMember(x => x.NeedsAuthentication, opts => opts.ResolveUsing(x => x.NeedsAuthentication)) .ForMember(x => x.ActivityTemplateStateTemplate, opts => opts.ResolveUsing((ActivityTemplateDTO x) => null)) - .ForMember(x => x.WebServiceId, opts => opts.ResolveUsing((ActivityTemplateDTO x) => null)) .ForMember(x => x.ActivityTemplateState, opts => opts.Ignore()) .ForMember(x => x.TerminalId, opts => opts.Ignore()) .ForMember(x => x.LastUpdated, opts => opts.Ignore()) @@ -121,6 +118,7 @@ public static void ConfigureAutoMapper() { ActivityCategory = new ActivityCategoryDO() { + Id = y.Id, Name = y.Name, IconPath = y.IconPath } @@ -164,10 +162,6 @@ public static void ConfigureAutoMapper() .ForMember(x => x.PlanId, opts => opts.ResolveUsing(x => x.RootPlanNodeId)) .ForMember(x => x.SubPlanId, opts => opts.ResolveUsing(x => x.Id)); - - Mapper.CreateMap(); - Mapper.CreateMap(); - Mapper.CreateMap().ConvertUsing(); Mapper.CreateMap(); diff --git a/Data/Infrastructure/DockyardDbContext.cs b/Data/Infrastructure/DockyardDbContext.cs index 3368e0fb7b..02eb6aede6 100644 --- a/Data/Infrastructure/DockyardDbContext.cs +++ b/Data/Infrastructure/DockyardDbContext.cs @@ -20,7 +20,7 @@ namespace Data.Infrastructure [DbConfigurationType(typeof(Fr8DbConfiguration))] public class DockyardDbContext : IdentityDbContext, IDBContext { - public static string DefaultConnectionStringName => "DockyardDB"; + public static string DefaultConnectionStringName => "Fr8LocalDB"; //This is to ensure compile will break if the reference to sql server is removed private static Type m_SqlProvider = typeof(SqlProviderServices); @@ -266,7 +266,6 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) modelBuilder.Entity().ToTable("ActivityTemplate"); modelBuilder.Entity().ToTable("ActivityCategory"); modelBuilder.Entity().ToTable("ActivityCategorySet"); - modelBuilder.Entity().ToTable("WebServices"); modelBuilder.Entity().ToTable("TerminalSubscription"); modelBuilder.Entity().ToTable("EncryptedAuthorizationData"); modelBuilder.Entity().ToTable("Tags"); @@ -346,12 +345,6 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) .WillCascadeOnDelete(false); - modelBuilder.Entity() - .HasOptional(x => x.WebService) // was HasRequired. In reality this relationship looks like to be optional. - .WithMany() - .HasForeignKey(x => x.WebServiceId) - .WillCascadeOnDelete(false); - modelBuilder.Entity().ToTable("Organizations") .HasMany(x => x.Fr8Accounts) .WithOptional(x => x.Organization) @@ -359,7 +352,6 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) .WillCascadeOnDelete(false); modelBuilder.Entity().ToTable("PageDefinitions"); - modelBuilder.Entity().ToTable("TerminalRegistration"); base.OnModelCreating(modelBuilder); } diff --git a/Data/Infrastructure/StructureMap/ISecurityServices.cs b/Data/Infrastructure/StructureMap/ISecurityServices.cs index ed3ad80567..68907aaebe 100644 --- a/Data/Infrastructure/StructureMap/ISecurityServices.cs +++ b/Data/Infrastructure/StructureMap/ISecurityServices.cs @@ -21,10 +21,10 @@ public interface ISecurityServices void Logout(); ClaimsIdentity GetIdentity(IUnitOfWork uow, Fr8AccountDO dockyardAccountDO); Task GetIdentityAsync(IUnitOfWork uow, Fr8AccountDO dockyardAccountDO); - bool AuthorizeActivity(PermissionType permissionType, string curObjectId, string curObjectType, string propertyName = null); + bool AuthorizeActivity(PermissionType permissionType, Guid curObjectId, string curObjectType, string propertyName = null); bool UserHasPermission(PermissionType permissionType, string objectType); - void SetDefaultRecordBasedSecurityForObject(string roleName, string dataObjectId, string dataObjectType, List customPermissions = null); + void SetDefaultRecordBasedSecurityForObject(string roleName, Guid dataObjectId, string dataObjectType, List customPermissions = null); IEnumerable GetAllowedTerminalsByUser(IEnumerable terminals); - List GetAllowedUserRolesForSecuredObject(string objectId, string objectType); + List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType); } } \ No newline at end of file diff --git a/Data/Infrastructure/StructureMap/MockedSecurityServices.cs b/Data/Infrastructure/StructureMap/MockedSecurityServices.cs index 15c917987b..3003e26f85 100644 --- a/Data/Infrastructure/StructureMap/MockedSecurityServices.cs +++ b/Data/Infrastructure/StructureMap/MockedSecurityServices.cs @@ -79,7 +79,7 @@ public Task GetIdentityAsync(IUnitOfWork uow, Fr8AccountDO docky throw new NotImplementedException(); } - public bool AuthorizeActivity(PermissionType permissionName, string curObjectId, string curObjectType, string propertyName = null) + public bool AuthorizeActivity(PermissionType permissionName, Guid curObjectId, string curObjectType, string propertyName = null) { //check if user is authenticated. Unauthenticated users cannot pass security and come up to here, which means this is internal fr8 event, that need to be passed if (!IsAuthenticated()) @@ -95,7 +95,7 @@ public bool AuthorizeActivity(PermissionType permissionName, string curObjectId, var securityStorageProvider = ObjectFactory.GetInstance(); var permissionSets = securityStorageProvider.GetObjectBasedPermissionSetForObject(curObjectId, curObjectType, Guid.Empty); - var modifyAllData = permissionSets.FirstOrDefault(x => x == (int) PermissionType.ModifyAllObjects); + var modifyAllData = permissionSets.FirstOrDefault(x => x == (int) PermissionType.EditAllObjects); var viewAllData = permissionSets.FirstOrDefault(x => x == (int) PermissionType.ViewAllObjects); if (viewAllData != 0 && permissionName == PermissionType.ReadObject) return true; @@ -112,10 +112,10 @@ public bool UserHasPermission(PermissionType permissionType, string objectType) return true; } - public void SetDefaultRecordBasedSecurityForObject(string roleName, string dataObjectId, string dataObjectType, List customPermissionTypes = null ) + public void SetDefaultRecordBasedSecurityForObject(string roleName, Guid dataObjectId, string dataObjectType, List customPermissionTypes = null ) { var securityStorageProvider = ObjectFactory.GetInstance(); - securityStorageProvider.SetDefaultRecordBasedSecurityForObject(GetCurrentUser(), Roles.OwnerOfCurrentObject, dataObjectId.ToString(), dataObjectType, Guid.Empty, null, null); + securityStorageProvider.SetDefaultRecordBasedSecurityForObject(GetCurrentUser(), Roles.OwnerOfCurrentObject, dataObjectId, dataObjectType, Guid.Empty, null, null); } public IEnumerable GetAllowedTerminalsByUser(IEnumerable terminals) @@ -123,7 +123,7 @@ public IEnumerable GetAllowedTerminalsByUser(IEnumerable return terminals; } - public List GetAllowedUserRolesForSecuredObject(string objectId, string objectType) + public List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType) { throw new NotImplementedException(); } diff --git a/Data/Infrastructure/UnitOfWork.cs b/Data/Infrastructure/UnitOfWork.cs index 39c01e1030..d910b31e80 100644 --- a/Data/Infrastructure/UnitOfWork.cs +++ b/Data/Infrastructure/UnitOfWork.cs @@ -403,16 +403,6 @@ public ISubscriptionRepository SubscriptionRepository } } - private WebServiceRepository _webServiceRepository; - - public IWebServiceRepository WebServiceRepository - { - get - { - return _webServiceRepository ?? (_webServiceRepository = new WebServiceRepository(this)); - } - } - private TagRepository _tagRepository; public ITagRepository TagRepository @@ -448,15 +438,6 @@ public IOrganizationRepository OrganizationRepository public IPageDefinitionRepository PageDefinitionRepository => _pageDefinitionRepository ?? (_pageDefinitionRepository = new PageDefinitionRepository(this)); - private TerminalRegistrationRepository _terminalRegistrationRepository; - public TerminalRegistrationRepository TerminalRegistrationRepository - { - get - { - return _terminalRegistrationRepository ?? (_terminalRegistrationRepository = new TerminalRegistrationRepository(this)); - } - } - private IActivityCategoryRepository _activityCategoryRepository; public IActivityCategoryRepository ActivityCategoryRepository { diff --git a/Data/Interfaces/IMultiTenantObjectRepository.cs b/Data/Interfaces/IMultiTenantObjectRepository.cs index ab8a555292..e6ed2740f1 100644 --- a/Data/Interfaces/IMultiTenantObjectRepository.cs +++ b/Data/Interfaces/IMultiTenantObjectRepository.cs @@ -39,7 +39,7 @@ List Query(string fr8AccountId, Expression> @where) int Count(string fr8AccountId, Expression> where) where T : Manifest; - int? GetObjectId(string fr8AccountId, Expression> where) + Guid? GetObjectId(string fr8AccountId, Expression> where) where T : Manifest; } } \ No newline at end of file diff --git a/Data/Interfaces/ITerminalDO.cs b/Data/Interfaces/ITerminalDO.cs index df1f4b8c61..71992b51b0 100644 --- a/Data/Interfaces/ITerminalDO.cs +++ b/Data/Interfaces/ITerminalDO.cs @@ -4,7 +4,7 @@ namespace Data.Interfaces { public interface ITerminalDO : IBaseDO { - int Id { get; set; } + Guid Id { get; set; } string Name { get; set; } string Label { get; set; } int TerminalStatus { get; set; } diff --git a/Data/Interfaces/IUnitOfWork.cs b/Data/Interfaces/IUnitOfWork.cs index 2761ebec29..f28975be93 100644 --- a/Data/Interfaces/IUnitOfWork.cs +++ b/Data/Interfaces/IUnitOfWork.cs @@ -59,7 +59,6 @@ public interface IUnitOfWork : IDisposable ITerminalSubscriptionRepository TerminalSubscriptionRepository { get; } ISubscriptionRepository SubscriptionRepository { get; } - IWebServiceRepository WebServiceRepository { get; } ITagRepository TagRepository { get; } IFileTagsRepository FileTagsRepository { get; } @@ -68,8 +67,6 @@ public interface IUnitOfWork : IDisposable IPageDefinitionRepository PageDefinitionRepository { get; } - TerminalRegistrationRepository TerminalRegistrationRepository { get; } - IActivityCategoryRepository ActivityCategoryRepository { get; } IActivityCategorySetRepository ActivityCategorySetRepository { get; } diff --git a/Data/LICENSE b/Data/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Data/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Data/Migrations/201510120408332_InitialMigration.cs b/Data/Migrations/201510120408332_InitialMigration.cs index e448d61cbe..fe6e948216 100644 --- a/Data/Migrations/201510120408332_InitialMigration.cs +++ b/Data/Migrations/201510120408332_InitialMigration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class InitialMigration : DbMigration + public partial class InitialMigration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510130637359_UpdateDocuSignEventDo.cs b/Data/Migrations/201510130637359_UpdateDocuSignEventDo.cs index b1d959ad7c..fd5143a3d9 100644 --- a/Data/Migrations/201510130637359_UpdateDocuSignEventDo.cs +++ b/Data/Migrations/201510130637359_UpdateDocuSignEventDo.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UpdateDocuSignEventDo : DbMigration + public partial class UpdateDocuSignEventDo : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510141403432_Change ProcessTemplate to Route.cs b/Data/Migrations/201510141403432_Change ProcessTemplate to Route.cs index 0420fa9f3d..c7c84a7a83 100644 --- a/Data/Migrations/201510141403432_Change ProcessTemplate to Route.cs +++ b/Data/Migrations/201510141403432_Change ProcessTemplate to Route.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ChangeProcessTemplatetoRoute : DbMigration + public partial class ChangeProcessTemplatetoRoute : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510141530275_Rename ProcessNodeTemplate to Subroute.cs b/Data/Migrations/201510141530275_Rename ProcessNodeTemplate to Subroute.cs index aa3a5ada97..846f534ea0 100644 --- a/Data/Migrations/201510141530275_Rename ProcessNodeTemplate to Subroute.cs +++ b/Data/Migrations/201510141530275_Rename ProcessNodeTemplate to Subroute.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameProcessNodeTemplatetoSubroute : DbMigration + public partial class RenameProcessNodeTemplatetoSubroute : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510141822442_RemoveActionState.cs b/Data/Migrations/201510141822442_RemoveActionState.cs index 287b890311..25c2b8aa27 100644 --- a/Data/Migrations/201510141822442_RemoveActionState.cs +++ b/Data/Migrations/201510141822442_RemoveActionState.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveActionState : DbMigration + public partial class RemoveActionState : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510150439139_Rename_Process_To_Container_Migration.cs b/Data/Migrations/201510150439139_Rename_Process_To_Container_Migration.cs index 47bc67e304..5456723c7a 100644 --- a/Data/Migrations/201510150439139_Rename_Process_To_Container_Migration.cs +++ b/Data/Migrations/201510150439139_Rename_Process_To_Container_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Rename_Process_To_Container_Migration : DbMigration + public partial class Rename_Process_To_Container_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510150528051_FixUp_Migration.cs b/Data/Migrations/201510150528051_FixUp_Migration.cs index 0744b57485..179d9223a9 100644 --- a/Data/Migrations/201510150528051_FixUp_Migration.cs +++ b/Data/Migrations/201510150528051_FixUp_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class FixUp_Migration : DbMigration + public partial class FixUp_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510150812534_Rename_DockyardAccount_To_Fr8Account_Migration.cs b/Data/Migrations/201510150812534_Rename_DockyardAccount_To_Fr8Account_Migration.cs index 7db9fb052a..b6ec0b0277 100644 --- a/Data/Migrations/201510150812534_Rename_DockyardAccount_To_Fr8Account_Migration.cs +++ b/Data/Migrations/201510150812534_Rename_DockyardAccount_To_Fr8Account_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Rename_DockyardAccount_To_Fr8Account_Migration : DbMigration + public partial class Rename_DockyardAccount_To_Fr8Account_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510151001212_Rename_Activity_To_RouteNode_Migration.cs b/Data/Migrations/201510151001212_Rename_Activity_To_RouteNode_Migration.cs index 24f342df4c..dd405be2cf 100644 --- a/Data/Migrations/201510151001212_Rename_Activity_To_RouteNode_Migration.cs +++ b/Data/Migrations/201510151001212_Rename_Activity_To_RouteNode_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Rename_Activity_To_RouteNode_Migration : DbMigration + public partial class Rename_Activity_To_RouteNode_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510152143047_Add_Label_Property_To_ActionTemplate.cs b/Data/Migrations/201510152143047_Add_Label_Property_To_ActionTemplate.cs index 62be990e3a..f9261ce712 100644 --- a/Data/Migrations/201510152143047_Add_Label_Property_To_ActionTemplate.cs +++ b/Data/Migrations/201510152143047_Add_Label_Property_To_ActionTemplate.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Add_Label_Property_To_ActionTemplate : DbMigration + public partial class Add_Label_Property_To_ActionTemplate : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510181426528_RemoveFrAccountIdFromContainerDO.cs b/Data/Migrations/201510181426528_RemoveFrAccountIdFromContainerDO.cs index 3743d4a076..fa128db7c8 100644 --- a/Data/Migrations/201510181426528_RemoveFrAccountIdFromContainerDO.cs +++ b/Data/Migrations/201510181426528_RemoveFrAccountIdFromContainerDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveFrAccountIdFromContainerDO : DbMigration + public partial class RemoveFrAccountIdFromContainerDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510181719065_IngnoreChangesUpdate.cs b/Data/Migrations/201510181719065_IngnoreChangesUpdate.cs index 8d6c853a14..01206e8057 100644 --- a/Data/Migrations/201510181719065_IngnoreChangesUpdate.cs +++ b/Data/Migrations/201510181719065_IngnoreChangesUpdate.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class IngnoreChangesUpdate : DbMigration + public partial class IngnoreChangesUpdate : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510200747079_UpdateMTTables.cs b/Data/Migrations/201510200747079_UpdateMTTables.cs index f304f4003c..a53e5a1dc1 100644 --- a/Data/Migrations/201510200747079_UpdateMTTables.cs +++ b/Data/Migrations/201510200747079_UpdateMTTables.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UpdateMTTables : DbMigration + public partial class UpdateMTTables : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510201228599_ModifiedAuthorizeTokenTable.cs b/Data/Migrations/201510201228599_ModifiedAuthorizeTokenTable.cs index 9b28972994..b4464f51ec 100644 --- a/Data/Migrations/201510201228599_ModifiedAuthorizeTokenTable.cs +++ b/Data/Migrations/201510201228599_ModifiedAuthorizeTokenTable.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ModifiedAuthorizeTokenTable : DbMigration + public partial class ModifiedAuthorizeTokenTable : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510202031291_NothingIgnoreChanages.cs b/Data/Migrations/201510202031291_NothingIgnoreChanages.cs index 47ec7203ea..ede0c4c867 100644 --- a/Data/Migrations/201510202031291_NothingIgnoreChanages.cs +++ b/Data/Migrations/201510202031291_NothingIgnoreChanages.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class NothingIgnoreChanages : DbMigration + public partial class NothingIgnoreChanages : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510212105295_AddMinPaneWidth.cs b/Data/Migrations/201510212105295_AddMinPaneWidth.cs index efd290309b..1ddacdf8c5 100644 --- a/Data/Migrations/201510212105295_AddMinPaneWidth.cs +++ b/Data/Migrations/201510212105295_AddMinPaneWidth.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddMinPaneWidth : DbMigration + public partial class AddMinPaneWidth : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510221210362_ActivityTemplate_AuthType_Migration.cs b/Data/Migrations/201510221210362_ActivityTemplate_AuthType_Migration.cs index 6af61ebd08..9221a60d5b 100644 --- a/Data/Migrations/201510221210362_ActivityTemplate_AuthType_Migration.cs +++ b/Data/Migrations/201510221210362_ActivityTemplate_AuthType_Migration.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { - public partial class ActivityTemplate_AuthType_Migration : DockyardDbMigration + public partial class ActivityTemplate_AuthType_Migration : DbMigration { public override void Up() { diff --git a/Data/Migrations/201510230242497_FixUp_2_Migration.cs b/Data/Migrations/201510230242497_FixUp_2_Migration.cs index 57bda3ebab..2d77efecd4 100644 --- a/Data/Migrations/201510230242497_FixUp_2_Migration.cs +++ b/Data/Migrations/201510230242497_FixUp_2_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class FixUp_2_Migration : DbMigration + public partial class FixUp_2_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510252034017_AddTagsToActivityTemplateDO.cs b/Data/Migrations/201510252034017_AddTagsToActivityTemplateDO.cs index d50209e061..359d4153f0 100644 --- a/Data/Migrations/201510252034017_AddTagsToActivityTemplateDO.cs +++ b/Data/Migrations/201510252034017_AddTagsToActivityTemplateDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddTagsToActivityTemplateDO : DbMigration + public partial class AddTagsToActivityTemplateDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510261339053_CreateWebServicesTable_Migration.cs b/Data/Migrations/201510261339053_CreateWebServicesTable_Migration.cs index a8212a8155..40e922aaab 100644 --- a/Data/Migrations/201510261339053_CreateWebServicesTable_Migration.cs +++ b/Data/Migrations/201510261339053_CreateWebServicesTable_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class CreateWebServicesTable_Migration : DbMigration + public partial class CreateWebServicesTable_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510271338091_ActivityTemplate_Add_WebServiceReference_Migration.cs b/Data/Migrations/201510271338091_ActivityTemplate_Add_WebServiceReference_Migration.cs index 6102ad9757..40b2b50fc4 100644 --- a/Data/Migrations/201510271338091_ActivityTemplate_Add_WebServiceReference_Migration.cs +++ b/Data/Migrations/201510271338091_ActivityTemplate_Add_WebServiceReference_Migration.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class ActivityTemplate_Add_WebServiceReference_Migration : DbMigration + public partial class ActivityTemplate_Add_WebServiceReference_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201510271826316_MERGE_Migration.cs b/Data/Migrations/201510271826316_MERGE_Migration.cs index 7cefbf125e..54e36bbcf9 100644 --- a/Data/Migrations/201510271826316_MERGE_Migration.cs +++ b/Data/Migrations/201510271826316_MERGE_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class MERGE_Migration : DbMigration + public partial class MERGE_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511040622414_AddedDocuSignFields.cs b/Data/Migrations/201511040622414_AddedDocuSignFields.cs index 33e76515b7..197dad9011 100644 --- a/Data/Migrations/201511040622414_AddedDocuSignFields.cs +++ b/Data/Migrations/201511040622414_AddedDocuSignFields.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedDocuSignFields : DbMigration + public partial class AddedDocuSignFields : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511062013473_AddActivityTemplateState.cs b/Data/Migrations/201511062013473_AddActivityTemplateState.cs index fa52e83844..a9b311d28d 100644 --- a/Data/Migrations/201511062013473_AddActivityTemplateState.cs +++ b/Data/Migrations/201511062013473_AddActivityTemplateState.cs @@ -4,7 +4,7 @@ namespace Data.Migrations using System.Data.Entity.Migrations; using Data.States; - public partial class AddActivityTemplateState : DockyardDbMigration + public partial class AddActivityTemplateState : DbMigration { public override void Up() { diff --git a/Data/Migrations/201511101607186_Renamed_Plugin_To_Terminal_Final.cs b/Data/Migrations/201511101607186_Renamed_Plugin_To_Terminal_Final.cs index f5d548c350..8467733f12 100644 --- a/Data/Migrations/201511101607186_Renamed_Plugin_To_Terminal_Final.cs +++ b/Data/Migrations/201511101607186_Renamed_Plugin_To_Terminal_Final.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class Renamed_Plugin_To_Terminal_Final : DbMigration + public partial class Renamed_Plugin_To_Terminal_Final : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511130248445_MakeWebServicesOptional.cs b/Data/Migrations/201511130248445_MakeWebServicesOptional.cs index d5587f8ab8..46dd257b12 100644 --- a/Data/Migrations/201511130248445_MakeWebServicesOptional.cs +++ b/Data/Migrations/201511130248445_MakeWebServicesOptional.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class MakeWebServicesOptional : DbMigration + public partial class MakeWebServicesOptional : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511131623530_Container_Id_Int32_To_Guid.cs b/Data/Migrations/201511131623530_Container_Id_Int32_To_Guid.cs index 9b221f28e6..dc2dadc17e 100644 --- a/Data/Migrations/201511131623530_Container_Id_Int32_To_Guid.cs +++ b/Data/Migrations/201511131623530_Container_Id_Int32_To_Guid.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Container_Id_Int32_To_Guid : DbMigration + public partial class Container_Id_Int32_To_Guid : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511160905225_Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal.cs b/Data/Migrations/201511160905225_Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal.cs index 5f1284c841..948cc0daa7 100644 --- a/Data/Migrations/201511160905225_Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal.cs +++ b/Data/Migrations/201511160905225_Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal : DbMigration + public partial class Added_TerminalSubscription_SubscriptionStatus_Edited_Terminal : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511170753503_RouteDO_Tag.cs b/Data/Migrations/201511170753503_RouteDO_Tag.cs index 37b0c4c815..8641b8d068 100644 --- a/Data/Migrations/201511170753503_RouteDO_Tag.cs +++ b/Data/Migrations/201511170753503_RouteDO_Tag.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RouteDO_Tag : DbMigration + public partial class RouteDO_Tag : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511192035266_Added_Description_ActivityTemplate.cs b/Data/Migrations/201511192035266_Added_Description_ActivityTemplate.cs index 92a3893b68..14243c1b46 100644 --- a/Data/Migrations/201511192035266_Added_Description_ActivityTemplate.cs +++ b/Data/Migrations/201511192035266_Added_Description_ActivityTemplate.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Added_Description_ActivityTemplate : DbMigration + public partial class Added_Description_ActivityTemplate : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511200612313_RouteNode_Id_Int32_To_Guid.cs b/Data/Migrations/201511200612313_RouteNode_Id_Int32_To_Guid.cs index 6bdf286ccd..c9044c9782 100644 --- a/Data/Migrations/201511200612313_RouteNode_Id_Int32_To_Guid.cs +++ b/Data/Migrations/201511200612313_RouteNode_Id_Int32_To_Guid.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RouteNode_Id_Int32_To_Guid : DbMigration + public partial class RouteNode_Id_Int32_To_Guid : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511240533318_Standard_Configuration_Controls_To_Standard_UI_Controls.cs b/Data/Migrations/201511240533318_Standard_Configuration_Controls_To_Standard_UI_Controls.cs index 371bad147a..1f5f6efe7d 100644 --- a/Data/Migrations/201511240533318_Standard_Configuration_Controls_To_Standard_UI_Controls.cs +++ b/Data/Migrations/201511240533318_Standard_Configuration_Controls_To_Standard_UI_Controls.cs @@ -4,7 +4,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class Standard_Configuration_Controls_To_Standard_UI_Controls : DbMigration + public partial class Standard_Configuration_Controls_To_Standard_UI_Controls : System.Data.Entity.Migrations.DbMigration { private string oldValue = "Standard Configuration Controls"; private string newValue = "Standard UI Controls"; diff --git a/Data/Migrations/201511250912363_Add_Description_To_Terminal.cs b/Data/Migrations/201511250912363_Add_Description_To_Terminal.cs index 42eb248e60..e719a6ac8f 100644 --- a/Data/Migrations/201511250912363_Add_Description_To_Terminal.cs +++ b/Data/Migrations/201511250912363_Add_Description_To_Terminal.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Add_Description_To_Terminal : DbMigration + public partial class Add_Description_To_Terminal : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511261934585_RenameCollectFormDataSolution.cs b/Data/Migrations/201511261934585_RenameCollectFormDataSolution.cs index b6d08270a2..77ca11751d 100644 --- a/Data/Migrations/201511261934585_RenameCollectFormDataSolution.cs +++ b/Data/Migrations/201511261934585_RenameCollectFormDataSolution.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameCollectFormDataSolution : DbMigration + public partial class RenameCollectFormDataSolution : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511271920340_RenameMonitorDocuSignAction.cs b/Data/Migrations/201511271920340_RenameMonitorDocuSignAction.cs index d537aa4edd..c3cb6636a6 100644 --- a/Data/Migrations/201511271920340_RenameMonitorDocuSignAction.cs +++ b/Data/Migrations/201511271920340_RenameMonitorDocuSignAction.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameMonitorDocuSignAction : DbMigration + public partial class RenameMonitorDocuSignAction : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511281709584_Merge2_Migration.cs b/Data/Migrations/201511281709584_Merge2_Migration.cs index f2001d4f4a..e9780cb590 100644 --- a/Data/Migrations/201511281709584_Merge2_Migration.cs +++ b/Data/Migrations/201511281709584_Merge2_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Merge2_Migration : DbMigration + public partial class Merge2_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201511281946401_Empty.cs b/Data/Migrations/201511281946401_Empty.cs index 17620425c9..6839ff9a9f 100644 --- a/Data/Migrations/201511281946401_Empty.cs +++ b/Data/Migrations/201511281946401_Empty.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Empty : DbMigration + public partial class Empty : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512121229183_RenameGoogleSheetsAction.cs b/Data/Migrations/201512121229183_RenameGoogleSheetsAction.cs index f2b4ea8207..a34d51b154 100644 --- a/Data/Migrations/201512121229183_RenameGoogleSheetsAction.cs +++ b/Data/Migrations/201512121229183_RenameGoogleSheetsAction.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameGoogleSheetsAction : DbMigration + public partial class RenameGoogleSheetsAction : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512141152067_AddedActivityTypeToActivityTemplateDO.cs b/Data/Migrations/201512141152067_AddedActivityTypeToActivityTemplateDO.cs index 75a5d09f22..55f4a1fe27 100644 --- a/Data/Migrations/201512141152067_AddedActivityTypeToActivityTemplateDO.cs +++ b/Data/Migrations/201512141152067_AddedActivityTypeToActivityTemplateDO.cs @@ -4,7 +4,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class AddedActivityTypeToActivityTemplateDO : DbMigration + public partial class AddedActivityTypeToActivityTemplateDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512161607506_SplitAuthorizationTokenDO.cs b/Data/Migrations/201512161607506_SplitAuthorizationTokenDO.cs index d18b4b70f8..5ea9e38f2e 100644 --- a/Data/Migrations/201512161607506_SplitAuthorizationTokenDO.cs +++ b/Data/Migrations/201512161607506_SplitAuthorizationTokenDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class SplitAuthorizationTokenDO : DbMigration + public partial class SplitAuthorizationTokenDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512211641017_AddedComponentToHistoryItemDO.cs b/Data/Migrations/201512211641017_AddedComponentToHistoryItemDO.cs index 9e438a6162..d470754fe9 100644 --- a/Data/Migrations/201512211641017_AddedComponentToHistoryItemDO.cs +++ b/Data/Migrations/201512211641017_AddedComponentToHistoryItemDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedComponentToHistoryItemDO : DbMigration + public partial class AddedComponentToHistoryItemDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512251516487_Authorization_V2_Migration.cs b/Data/Migrations/201512251516487_Authorization_V2_Migration.cs index 0a46d2fa01..b578395292 100644 --- a/Data/Migrations/201512251516487_Authorization_V2_Migration.cs +++ b/Data/Migrations/201512251516487_Authorization_V2_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Authorization_V2_Migration : DbMigration + public partial class Authorization_V2_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201512311353389_Removed_From_FileDO.cs b/Data/Migrations/201512311353389_Removed_From_FileDO.cs index f26dc6735e..50f0f682ef 100644 --- a/Data/Migrations/201512311353389_Removed_From_FileDO.cs +++ b/Data/Migrations/201512311353389_Removed_From_FileDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Removed_From_FileDO : DbMigration + public partial class Removed_From_FileDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601031440042_Added_Tag_And_FileTags.cs b/Data/Migrations/201601031440042_Added_Tag_And_FileTags.cs index e315da7504..b3dc8e139f 100644 --- a/Data/Migrations/201601031440042_Added_Tag_And_FileTags.cs +++ b/Data/Migrations/201601031440042_Added_Tag_And_FileTags.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Added_Tag_And_FileTags : DbMigration + public partial class Added_Tag_And_FileTags : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601150502349_RouteNodeDO_RootId.cs b/Data/Migrations/201601150502349_RouteNodeDO_RootId.cs index 0820f9b304..cdcd8c8295 100644 --- a/Data/Migrations/201601150502349_RouteNodeDO_RootId.cs +++ b/Data/Migrations/201601150502349_RouteNodeDO_RootId.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RouteNodeDO_RootId : DbMigration + public partial class RouteNodeDO_RootId : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601151838550_AddedPublicIdentifierAndSecretoToTerminalDO.cs b/Data/Migrations/201601151838550_AddedPublicIdentifierAndSecretoToTerminalDO.cs index 615608164b..cd594c4b64 100644 --- a/Data/Migrations/201601151838550_AddedPublicIdentifierAndSecretoToTerminalDO.cs +++ b/Data/Migrations/201601151838550_AddedPublicIdentifierAndSecretoToTerminalDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedPublicIdentifierAndSecretoToTerminalDO : DbMigration + public partial class AddedPublicIdentifierAndSecretoToTerminalDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601201708533_Added_Fr8Account_2RouteNode.cs b/Data/Migrations/201601201708533_Added_Fr8Account_2RouteNode.cs index 2d09f081b2..04a6778eac 100644 --- a/Data/Migrations/201601201708533_Added_Fr8Account_2RouteNode.cs +++ b/Data/Migrations/201601201708533_Added_Fr8Account_2RouteNode.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Added_Fr8Account_2RouteNode : DbMigration + public partial class Added_Fr8Account_2RouteNode : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601201734569_Removed_Fr8Account_From_Route.cs b/Data/Migrations/201601201734569_Removed_Fr8Account_From_Route.cs index 73ef034044..e3e5742545 100644 --- a/Data/Migrations/201601201734569_Removed_Fr8Account_From_Route.cs +++ b/Data/Migrations/201601201734569_Removed_Fr8Account_From_Route.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Removed_Fr8Account_From_Route : DbMigration + public partial class Removed_Fr8Account_From_Route : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601211438483_Add_Test_User.cs b/Data/Migrations/201601211438483_Add_Test_User.cs index ee88b80469..1a304ef758 100644 --- a/Data/Migrations/201601211438483_Add_Test_User.cs +++ b/Data/Migrations/201601211438483_Add_Test_User.cs @@ -10,7 +10,7 @@ namespace Data.Migrations using System.Data.Entity.Migrations; //This migration added test user //To complete it, we make add rows to tables _UserStateTemplate, EmailAddress, AspNetUsers and finally User. - public partial class Add_Test_User : DbMigration + public partial class Add_Test_User : System.Data.Entity.Migrations.DbMigration { private string email = "integration_test_runner@fr8.company"; private string name = "IntegrationTestRunner"; @@ -21,7 +21,7 @@ public override void Up() { using (var uow = ObjectFactory.GetInstance()) { - MigrationConfiguration.CreateDockyardAccount(email, password, uow); + MigrationConfiguration.CreateFr8Account(email, password, uow); } //var passwordHasher = new PasswordHasher(); diff --git a/Data/Migrations/201601240842409_EmptyMigration.cs b/Data/Migrations/201601240842409_EmptyMigration.cs index 1c81cf5c63..96e9ad4986 100644 --- a/Data/Migrations/201601240842409_EmptyMigration.cs +++ b/Data/Migrations/201601240842409_EmptyMigration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class EmptyMigration : DbMigration + public partial class EmptyMigration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601240908090_RenameActionToActivity.cs b/Data/Migrations/201601240908090_RenameActionToActivity.cs index bef182bdd2..2311c6b6d2 100644 --- a/Data/Migrations/201601240908090_RenameActionToActivity.cs +++ b/Data/Migrations/201601240908090_RenameActionToActivity.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameActionToActivity : DbMigration + public partial class RenameActionToActivity : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201601241443338_RenameRouteToPlan.cs b/Data/Migrations/201601241443338_RenameRouteToPlan.cs index 6cbe5db866..0c8fdc8fd5 100644 --- a/Data/Migrations/201601241443338_RenameRouteToPlan.cs +++ b/Data/Migrations/201601241443338_RenameRouteToPlan.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameRouteToPlan : DbMigration + public partial class RenameRouteToPlan : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602031204174_MergeMigration.cs b/Data/Migrations/201602031204174_MergeMigration.cs index ed6ab64378..d509457984 100644 --- a/Data/Migrations/201602031204174_MergeMigration.cs +++ b/Data/Migrations/201602031204174_MergeMigration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class MergeMigration : DbMigration + public partial class MergeMigration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602051229214_Add_Test_User_2.cs b/Data/Migrations/201602051229214_Add_Test_User_2.cs index 3ab40f9a97..42c9499a30 100644 --- a/Data/Migrations/201602051229214_Add_Test_User_2.cs +++ b/Data/Migrations/201602051229214_Add_Test_User_2.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class Add_Test_User_2 : DbMigration + public partial class Add_Test_User_2 : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602071156179_RemoveSubscriptionRequiredAndName.cs b/Data/Migrations/201602071156179_RemoveSubscriptionRequiredAndName.cs index 3e34011b94..99391021bd 100644 --- a/Data/Migrations/201602071156179_RemoveSubscriptionRequiredAndName.cs +++ b/Data/Migrations/201602071156179_RemoveSubscriptionRequiredAndName.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveSubscriptionRequiredAndNameFromActivity : DbMigration + public partial class RemoveSubscriptionRequiredAndNameFromActivity : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602121355488_RemovedNullableActivityTemplateIdFromActivityDO.cs b/Data/Migrations/201602121355488_RemovedNullableActivityTemplateIdFromActivityDO.cs index 64b58d0c76..12817ed5f2 100644 --- a/Data/Migrations/201602121355488_RemovedNullableActivityTemplateIdFromActivityDO.cs +++ b/Data/Migrations/201602121355488_RemovedNullableActivityTemplateIdFromActivityDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemovedNullableActivityTemplateIdFromActivityDO : DbMigration + public partial class RemovedNullableActivityTemplateIdFromActivityDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602122245004_Added_Footer_To_EnvelopeDO.cs b/Data/Migrations/201602122245004_Added_Footer_To_EnvelopeDO.cs index 09396fa240..47852c0d79 100644 --- a/Data/Migrations/201602122245004_Added_Footer_To_EnvelopeDO.cs +++ b/Data/Migrations/201602122245004_Added_Footer_To_EnvelopeDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Added_Footer_To_EnvelopeDO : DbMigration + public partial class Added_Footer_To_EnvelopeDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602141601318_Activity_AddedClientVisibility.cs b/Data/Migrations/201602141601318_Activity_AddedClientVisibility.cs index f9d54a1eeb..6b3bb1712c 100644 --- a/Data/Migrations/201602141601318_Activity_AddedClientVisibility.cs +++ b/Data/Migrations/201602141601318_Activity_AddedClientVisibility.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Activity_AddedClientVisibility : DbMigration + public partial class Activity_AddedClientVisibility : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602141719533_Activity_ClientVisibilityAllowNULL.cs b/Data/Migrations/201602141719533_Activity_ClientVisibilityAllowNULL.cs index c21e3cb8a2..cf55fcaaee 100644 --- a/Data/Migrations/201602141719533_Activity_ClientVisibilityAllowNULL.cs +++ b/Data/Migrations/201602141719533_Activity_ClientVisibilityAllowNULL.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Activity_ClientVisibilityAllowNULL : DbMigration + public partial class Activity_ClientVisibilityAllowNULL : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602170735431_RemoveMTActivitiesAndRemoveFr8CoreWebServices.cs b/Data/Migrations/201602170735431_RemoveMTActivitiesAndRemoveFr8CoreWebServices.cs index 62e2e4e7c3..8eb36759ee 100644 --- a/Data/Migrations/201602170735431_RemoveMTActivitiesAndRemoveFr8CoreWebServices.cs +++ b/Data/Migrations/201602170735431_RemoveMTActivitiesAndRemoveFr8CoreWebServices.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveMTActivitiesAndRemoveFr8CoreWebServices : DbMigration + public partial class RemoveMTActivitiesAndRemoveFr8CoreWebServices : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602191529576_RemoveActivityTemplateDupesAndAddConstaints.cs b/Data/Migrations/201602191529576_RemoveActivityTemplateDupesAndAddConstaints.cs index 742e466d58..a7cfa64bb0 100644 --- a/Data/Migrations/201602191529576_RemoveActivityTemplateDupesAndAddConstaints.cs +++ b/Data/Migrations/201602191529576_RemoveActivityTemplateDupesAndAddConstaints.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveActivityTemplateDupesAndAddConstaints : DbMigration + public partial class RemoveActivityTemplateDupesAndAddConstaints : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602241821266_UpdateMtFieldTypes.cs b/Data/Migrations/201602241821266_UpdateMtFieldTypes.cs index c594261b2e..9fdfffd23e 100644 --- a/Data/Migrations/201602241821266_UpdateMtFieldTypes.cs +++ b/Data/Migrations/201602241821266_UpdateMtFieldTypes.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UpdateMtFieldTypes : DbMigration + public partial class UpdateMtFieldTypes : System.Data.Entity.Migrations.DbMigration { const string SqlToRun = @" declare @typeId int diff --git a/Data/Migrations/201602270535022_Plan_Visibility.cs b/Data/Migrations/201602270535022_Plan_Visibility.cs index 726214ad11..6bc0a65a2f 100644 --- a/Data/Migrations/201602270535022_Plan_Visibility.cs +++ b/Data/Migrations/201602270535022_Plan_Visibility.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Plan_Visibility : DbMigration + public partial class Plan_Visibility : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201602290745114_AddedCateogryColumn_PlanDO.cs b/Data/Migrations/201602290745114_AddedCateogryColumn_PlanDO.cs index 8fe91af43d..51ddefbf26 100644 --- a/Data/Migrations/201602290745114_AddedCateogryColumn_PlanDO.cs +++ b/Data/Migrations/201602290745114_AddedCateogryColumn_PlanDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedCateogryColumn_PlanDO : DbMigration + public partial class AddedCateogryColumn_PlanDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603021529530_MoveToSqlMt.cs b/Data/Migrations/201603021529530_MoveToSqlMt.cs index 740a9dde11..b9fc878995 100644 --- a/Data/Migrations/201603021529530_MoveToSqlMt.cs +++ b/Data/Migrations/201603021529530_MoveToSqlMt.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class MoveToSqlMt : DbMigration + public partial class MoveToSqlMt : System.Data.Entity.Migrations.DbMigration { const string DropNewStructure = @" IF OBJECT_ID('dbo.MtData', 'U') IS NOT NULL diff --git a/Data/Migrations/201603041104310_MigrateMTData.cs b/Data/Migrations/201603041104310_MigrateMTData.cs index c36a10b0cf..ca4d876bba 100644 --- a/Data/Migrations/201603041104310_MigrateMTData.cs +++ b/Data/Migrations/201603041104310_MigrateMTData.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class MigrateMTData : DbMigration + public partial class MigrateMTData : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603051236490_FasterMigrateMTData.cs b/Data/Migrations/201603051236490_FasterMigrateMTData.cs index 3a5ef92e77..084af16881 100644 --- a/Data/Migrations/201603051236490_FasterMigrateMTData.cs +++ b/Data/Migrations/201603051236490_FasterMigrateMTData.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class FasterMigrateMTData : DbMigration + public partial class FasterMigrateMTData : System.Data.Entity.Migrations.DbMigration { const string SqlScript = @" IF OBJECT_ID('tempdb.dbo.#MtTypes', 'U') IS NOT NULL diff --git a/Data/Migrations/201603152035015_Rename_Save_In_Google_Sheet_Activity.cs b/Data/Migrations/201603152035015_Rename_Save_In_Google_Sheet_Activity.cs index d3aca6a2b2..4d1e9d2e75 100644 --- a/Data/Migrations/201603152035015_Rename_Save_In_Google_Sheet_Activity.cs +++ b/Data/Migrations/201603152035015_Rename_Save_In_Google_Sheet_Activity.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Rename_Save_In_Google_Sheet_Activity : DbMigration + public partial class Rename_Save_In_Google_Sheet_Activity : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603170621005_ChangeRouteToPlan.cs b/Data/Migrations/201603170621005_ChangeRouteToPlan.cs index a89c6aa5c2..db91436b13 100644 --- a/Data/Migrations/201603170621005_ChangeRouteToPlan.cs +++ b/Data/Migrations/201603170621005_ChangeRouteToPlan.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ChangeRouteToPlan : DbMigration + public partial class ChangeRouteToPlan : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603191417514_Renamed_ReceiveGoogleForm_To_MonitorFormResponses.cs b/Data/Migrations/201603191417514_Renamed_ReceiveGoogleForm_To_MonitorFormResponses.cs index b3f6c1fecf..0d6129739e 100644 --- a/Data/Migrations/201603191417514_Renamed_ReceiveGoogleForm_To_MonitorFormResponses.cs +++ b/Data/Migrations/201603191417514_Renamed_ReceiveGoogleForm_To_MonitorFormResponses.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Renamed_ReceiveGoogleForm_To_MonitorFormResponses : DbMigration + public partial class Renamed_ReceiveGoogleForm_To_MonitorFormResponses : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603271818114_Organizations_Table_Check.cs b/Data/Migrations/201603271818114_Organizations_Table_Check.cs index bd10c21375..94059ad9c9 100644 --- a/Data/Migrations/201603271818114_Organizations_Table_Check.cs +++ b/Data/Migrations/201603271818114_Organizations_Table_Check.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Organizations_Table_Check : DbMigration + public partial class Organizations_Table_Check : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603302057295_Table_RolePrivilege.cs b/Data/Migrations/201603302057295_Table_RolePrivilege.cs index 40bf57fc94..195aea2ac7 100644 --- a/Data/Migrations/201603302057295_Table_RolePrivilege.cs +++ b/Data/Migrations/201603302057295_Table_RolePrivilege.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Table_RolePrivilege : DbMigration + public partial class Table_RolePrivilege : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603311051449_Table_ObjectRolePrivileges.cs b/Data/Migrations/201603311051449_Table_ObjectRolePrivileges.cs index 0ee90909e7..90cca4c331 100644 --- a/Data/Migrations/201603311051449_Table_ObjectRolePrivileges.cs +++ b/Data/Migrations/201603311051449_Table_ObjectRolePrivileges.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Table_ObjectRolePrivileges : DbMigration + public partial class Table_ObjectRolePrivileges : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201603311220032_OwnerOfObject_Role_Data.cs b/Data/Migrations/201603311220032_OwnerOfObject_Role_Data.cs index 27f9d36255..3e0ef22913 100644 --- a/Data/Migrations/201603311220032_OwnerOfObject_Role_Data.cs +++ b/Data/Migrations/201603311220032_OwnerOfObject_Role_Data.cs @@ -6,7 +6,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class OwnerOfObject_Role_Data : DbMigration + public partial class OwnerOfObject_Role_Data : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604061440228_RenameContainerFields.cs b/Data/Migrations/201604061440228_RenameContainerFields.cs index 37a67eea75..47955fcec0 100644 --- a/Data/Migrations/201604061440228_RenameContainerFields.cs +++ b/Data/Migrations/201604061440228_RenameContainerFields.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RenameContainerFields : DbMigration + public partial class RenameContainerFields : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604112326145_Empty_Fix_Migration.cs b/Data/Migrations/201604112326145_Empty_Fix_Migration.cs index acabc95ca3..6bbdcb91a1 100644 --- a/Data/Migrations/201604112326145_Empty_Fix_Migration.cs +++ b/Data/Migrations/201604112326145_Empty_Fix_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Empty_Fix_Migration : DbMigration + public partial class Empty_Fix_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604130047415_ProcessNodesRemoved.cs b/Data/Migrations/201604130047415_ProcessNodesRemoved.cs index 59a53e78fe..d3f7386345 100644 --- a/Data/Migrations/201604130047415_ProcessNodesRemoved.cs +++ b/Data/Migrations/201604130047415_ProcessNodesRemoved.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ProcessNodesRemoved : DbMigration + public partial class ProcessNodesRemoved : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604150901444_ActivityTemplateDO_Id_Int32_To_Guid.cs b/Data/Migrations/201604150901444_ActivityTemplateDO_Id_Int32_To_Guid.cs index 68d4bafd0c..2e8a8a7787 100644 --- a/Data/Migrations/201604150901444_ActivityTemplateDO_Id_Int32_To_Guid.cs +++ b/Data/Migrations/201604150901444_ActivityTemplateDO_Id_Int32_To_Guid.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ActivityTemplateDO_Id_Int32_To_Guid : DbMigration + public partial class ActivityTemplateDO_Id_Int32_To_Guid : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604160406197_PlanNodeDO_Runnable.cs b/Data/Migrations/201604160406197_PlanNodeDO_Runnable.cs index 52c62233c5..de30625d87 100644 --- a/Data/Migrations/201604160406197_PlanNodeDO_Runnable.cs +++ b/Data/Migrations/201604160406197_PlanNodeDO_Runnable.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class PlanNodeDO_Runnable : DbMigration + public partial class PlanNodeDO_Runnable : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604171806555_HistoryItemDO_CustomerId_to_Fr8UserId.cs b/Data/Migrations/201604171806555_HistoryItemDO_CustomerId_to_Fr8UserId.cs index af991eaaf8..018afb8354 100644 --- a/Data/Migrations/201604171806555_HistoryItemDO_CustomerId_to_Fr8UserId.cs +++ b/Data/Migrations/201604171806555_HistoryItemDO_CustomerId_to_Fr8UserId.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class HistoryItemDO_CustomerId_to_Fr8UserId : DbMigration + public partial class HistoryItemDO_CustomerId_to_Fr8UserId : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604191731406_AddLabelToTerminals.cs b/Data/Migrations/201604191731406_AddLabelToTerminals.cs index b5c56fd1f9..290e9a1ed4 100644 --- a/Data/Migrations/201604191731406_AddLabelToTerminals.cs +++ b/Data/Migrations/201604191731406_AddLabelToTerminals.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddLabelToTerminals : DbMigration + public partial class AddLabelToTerminals : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604250944024_AddThemeToOrganization.cs b/Data/Migrations/201604250944024_AddThemeToOrganization.cs index c99f5c3ea4..621aabedba 100644 --- a/Data/Migrations/201604250944024_AddThemeToOrganization.cs +++ b/Data/Migrations/201604250944024_AddThemeToOrganization.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddThemeToOrganization : DbMigration + public partial class AddThemeToOrganization : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604272231431_AddExternalDomainIdToAuthorizationToken.cs b/Data/Migrations/201604272231431_AddExternalDomainIdToAuthorizationToken.cs index 9d5ba35251..c4fcf4ad33 100644 --- a/Data/Migrations/201604272231431_AddExternalDomainIdToAuthorizationToken.cs +++ b/Data/Migrations/201604272231431_AddExternalDomainIdToAuthorizationToken.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddExternalDomainIdToAuthorizationToken : DbMigration + public partial class AddExternalDomainIdToAuthorizationToken : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201604292019158_Security_Infrastructure.cs b/Data/Migrations/201604292019158_Security_Infrastructure.cs index e125be2cda..4b0c117440 100644 --- a/Data/Migrations/201604292019158_Security_Infrastructure.cs +++ b/Data/Migrations/201604292019158_Security_Infrastructure.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Security_Infrastructure : DbMigration + public partial class Security_Infrastructure : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605020854120_EncryptedCrateStorageAdded.cs b/Data/Migrations/201605020854120_EncryptedCrateStorageAdded.cs index 0cac005b42..44cbefa4a6 100644 --- a/Data/Migrations/201605020854120_EncryptedCrateStorageAdded.cs +++ b/Data/Migrations/201605020854120_EncryptedCrateStorageAdded.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class EncryptedCrateStorageAdded : DbMigration + public partial class EncryptedCrateStorageAdded : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605051106203_AddNameToActivity.cs b/Data/Migrations/201605051106203_AddNameToActivity.cs index 6b0481b5b6..72d07fceba 100644 --- a/Data/Migrations/201605051106203_AddNameToActivity.cs +++ b/Data/Migrations/201605051106203_AddNameToActivity.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddNameToActivity : DbMigration + public partial class AddNameToActivity : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605061523484_UpdateMTDatabaseWithNewCLRTypes.cs b/Data/Migrations/201605061523484_UpdateMTDatabaseWithNewCLRTypes.cs index 9fd5f5b5ca..755c608a06 100644 --- a/Data/Migrations/201605061523484_UpdateMTDatabaseWithNewCLRTypes.cs +++ b/Data/Migrations/201605061523484_UpdateMTDatabaseWithNewCLRTypes.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UpdateMTDatabaseWithNewCLRTypes : DbMigration + public partial class UpdateMTDatabaseWithNewCLRTypes : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605091247127_Plan_Templates.cs b/Data/Migrations/201605091247127_Plan_Templates.cs index e425fff7a2..9f63171443 100644 --- a/Data/Migrations/201605091247127_Plan_Templates.cs +++ b/Data/Migrations/201605091247127_Plan_Templates.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Plan_Templates : DbMigration + public partial class Plan_Templates : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605092037130_AddExternalAccountAndDomainNameToAuthToken.cs b/Data/Migrations/201605092037130_AddExternalAccountAndDomainNameToAuthToken.cs index 116f194405..e265f1069a 100644 --- a/Data/Migrations/201605092037130_AddExternalAccountAndDomainNameToAuthToken.cs +++ b/Data/Migrations/201605092037130_AddExternalAccountAndDomainNameToAuthToken.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddExternalAccountAndDomainNameToAuthToken : DbMigration + public partial class AddExternalAccountAndDomainNameToAuthToken : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605102018494_Move_Profile_To_Fr8Account.cs b/Data/Migrations/201605102018494_Move_Profile_To_Fr8Account.cs index a95eea5f7e..c565fc05d0 100644 --- a/Data/Migrations/201605102018494_Move_Profile_To_Fr8Account.cs +++ b/Data/Migrations/201605102018494_Move_Profile_To_Fr8Account.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Move_Profile_To_Fr8Account : DbMigration + public partial class Move_Profile_To_Fr8Account : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605111857439_ActivityActivationState.cs b/Data/Migrations/201605111857439_ActivityActivationState.cs index d8331ac3ff..130ff5c546 100644 --- a/Data/Migrations/201605111857439_ActivityActivationState.cs +++ b/Data/Migrations/201605111857439_ActivityActivationState.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ActivityActivationState : DbMigration + public partial class ActivityActivationState : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605131245044_AddedClassPropertyToFr8AccountDO.cs b/Data/Migrations/201605131245044_AddedClassPropertyToFr8AccountDO.cs index e9419e0905..77354810bf 100644 --- a/Data/Migrations/201605131245044_AddedClassPropertyToFr8AccountDO.cs +++ b/Data/Migrations/201605131245044_AddedClassPropertyToFr8AccountDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedClassPropertyToFr8AccountDO : DbMigration + public partial class AddedClassPropertyToFr8AccountDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605191153007_Removed_CriteriaDO.cs b/Data/Migrations/201605191153007_Removed_CriteriaDO.cs index 81c073076a..90cffe2e00 100644 --- a/Data/Migrations/201605191153007_Removed_CriteriaDO.cs +++ b/Data/Migrations/201605191153007_Removed_CriteriaDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Removed_CriteriaDO : DbMigration + public partial class Removed_CriteriaDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605202117041_UtilizationMonitoring.cs b/Data/Migrations/201605202117041_UtilizationMonitoring.cs index 88159cc9fb..36e90bc143 100644 --- a/Data/Migrations/201605202117041_UtilizationMonitoring.cs +++ b/Data/Migrations/201605202117041_UtilizationMonitoring.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UtilizationMonitoring : DbMigration + public partial class UtilizationMonitoring : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201605231150066_AddOrganizationAndAccountToObjectRolePermissions.cs b/Data/Migrations/201605231150066_AddOrganizationAndAccountToObjectRolePermissions.cs index 7fb1dac7ff..2540c30a4f 100644 --- a/Data/Migrations/201605231150066_AddOrganizationAndAccountToObjectRolePermissions.cs +++ b/Data/Migrations/201605231150066_AddOrganizationAndAccountToObjectRolePermissions.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddOrganizationAndAccountToObjectRolePermissions : DbMigration + public partial class AddOrganizationAndAccountToObjectRolePermissions : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606071223281_Delete FindObjects solution.cs b/Data/Migrations/201606071223281_Delete FindObjects solution.cs index f166aad0ff..1950965238 100644 --- a/Data/Migrations/201606071223281_Delete FindObjects solution.cs +++ b/Data/Migrations/201606071223281_Delete FindObjects solution.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class DeleteFindObjectssolution : DbMigration + public partial class DeleteFindObjectssolution : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606081850360_UpdateMTDatabaseWithNewCLRTypes1.cs b/Data/Migrations/201606081850360_UpdateMTDatabaseWithNewCLRTypes1.cs index 869df98632..b70c800596 100644 --- a/Data/Migrations/201606081850360_UpdateMTDatabaseWithNewCLRTypes1.cs +++ b/Data/Migrations/201606081850360_UpdateMTDatabaseWithNewCLRTypes1.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class UpdateMTDatabaseWithNewCLRTypes1 : DbMigration + public partial class UpdateMTDatabaseWithNewCLRTypes1 : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606090249437_RemovingUnusedObjects.cs b/Data/Migrations/201606090249437_RemovingUnusedObjects.cs index 5a9ce22385..784da82aac 100644 --- a/Data/Migrations/201606090249437_RemovingUnusedObjects.cs +++ b/Data/Migrations/201606090249437_RemovingUnusedObjects.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemovingUnusedObjects : DbMigration + public partial class RemovingUnusedObjects : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606091512284_FillManifestRegistry.cs b/Data/Migrations/201606091512284_FillManifestRegistry.cs index cdda5e7ebf..5fd28c36a5 100644 --- a/Data/Migrations/201606091512284_FillManifestRegistry.cs +++ b/Data/Migrations/201606091512284_FillManifestRegistry.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class FillManifestRegistry : DbMigration + public partial class FillManifestRegistry : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606122001330_HistoryDateIndex.cs b/Data/Migrations/201606122001330_HistoryDateIndex.cs index 1f4feab82b..ac62f42084 100644 --- a/Data/Migrations/201606122001330_HistoryDateIndex.cs +++ b/Data/Migrations/201606122001330_HistoryDateIndex.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class HistoryDateIndex : DbMigration + public partial class HistoryDateIndex : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606131241031_PlanTemplate-Permissions.cs b/Data/Migrations/201606131241031_PlanTemplate-Permissions.cs index 1d957cbea4..dae3e5f73f 100644 --- a/Data/Migrations/201606131241031_PlanTemplate-Permissions.cs +++ b/Data/Migrations/201606131241031_PlanTemplate-Permissions.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class PlanTemplatePermissions : DbMigration + public partial class PlanTemplatePermissions : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606131429309_RemovedDocuSignAccountId.cs b/Data/Migrations/201606131429309_RemovedDocuSignAccountId.cs index e378642b09..21ccc59cde 100644 --- a/Data/Migrations/201606131429309_RemovedDocuSignAccountId.cs +++ b/Data/Migrations/201606131429309_RemovedDocuSignAccountId.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemovedDocuSignAccountId : DbMigration + public partial class RemovedDocuSignAccountId : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606141326120_FR-3514 Make activity classes naming consistent.cs b/Data/Migrations/201606141326120_FR-3514 Make activity classes naming consistent.cs index 465d8f1c9f..5a461c6074 100644 --- a/Data/Migrations/201606141326120_FR-3514 Make activity classes naming consistent.cs +++ b/Data/Migrations/201606141326120_FR-3514 Make activity classes naming consistent.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class FR3514Makeactivityclassesnamingconsistent : DbMigration + public partial class FR3514Makeactivityclassesnamingconsistent : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606180953421_AddedTerminalRegistrationDO.cs b/Data/Migrations/201606180953421_AddedTerminalRegistrationDO.cs index 260bad2334..025ca3dc57 100644 --- a/Data/Migrations/201606180953421_AddedTerminalRegistrationDO.cs +++ b/Data/Migrations/201606180953421_AddedTerminalRegistrationDO.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedTerminalRegistrationDO : DbMigration + public partial class AddedTerminalRegistrationDO : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606181115160_MoveFr8TerminalsTxtToDB.cs b/Data/Migrations/201606181115160_MoveFr8TerminalsTxtToDB.cs index cc3d98f5f3..8af380f811 100644 --- a/Data/Migrations/201606181115160_MoveFr8TerminalsTxtToDB.cs +++ b/Data/Migrations/201606181115160_MoveFr8TerminalsTxtToDB.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class MoveFr8TerminalsTxtToDB : DbMigration + public partial class MoveFr8TerminalsTxtToDB : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606190931116_Add_terminalStatX_Migration.cs b/Data/Migrations/201606190931116_Add_terminalStatX_Migration.cs index 68e1604c72..ab50357d0f 100644 --- a/Data/Migrations/201606190931116_Add_terminalStatX_Migration.cs +++ b/Data/Migrations/201606190931116_Add_terminalStatX_Migration.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Add_terminalStatX_Migration : DbMigration + public partial class Add_terminalStatX_Migration : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606241050298_AddedTerminalFacebook.cs b/Data/Migrations/201606241050298_AddedTerminalFacebook.cs index 442168b75f..c07927b47e 100644 --- a/Data/Migrations/201606241050298_AddedTerminalFacebook.cs +++ b/Data/Migrations/201606241050298_AddedTerminalFacebook.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddedTerminalFacebook : DbMigration + public partial class AddedTerminalFacebook : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606271048030_NullableExpiresAtForAuthToken.cs b/Data/Migrations/201606271048030_NullableExpiresAtForAuthToken.cs index aaf16857ab..d77c64871e 100644 --- a/Data/Migrations/201606271048030_NullableExpiresAtForAuthToken.cs +++ b/Data/Migrations/201606271048030_NullableExpiresAtForAuthToken.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class NullableExpiresAtForAuthToken : DbMigration + public partial class NullableExpiresAtForAuthToken : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201606300937169_AddPageDefinition.cs b/Data/Migrations/201606300937169_AddPageDefinition.cs index c7bf46b14c..062b7f7d62 100644 --- a/Data/Migrations/201606300937169_AddPageDefinition.cs +++ b/Data/Migrations/201606300937169_AddPageDefinition.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddPageDefinition : DbMigration + public partial class AddPageDefinition : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607041029473_ActivityCategory.cs b/Data/Migrations/201607041029473_ActivityCategory.cs index 0baec4683f..a5ff8b7998 100644 --- a/Data/Migrations/201607041029473_ActivityCategory.cs +++ b/Data/Migrations/201607041029473_ActivityCategory.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ActivityCategory : DbMigration + public partial class ActivityCategory : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607151938218_UpdateActivityTemplateIds.cs b/Data/Migrations/201607151938218_UpdateActivityTemplateIds.cs index 2e5b1811ce..504317f3b6 100644 --- a/Data/Migrations/201607151938218_UpdateActivityTemplateIds.cs +++ b/Data/Migrations/201607151938218_UpdateActivityTemplateIds.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class UpdateActivityTemplateIds : DbMigration + public partial class UpdateActivityTemplateIds : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607170250191_IsFr8OwnTerminal_Property.cs b/Data/Migrations/201607170250191_IsFr8OwnTerminal_Property.cs index a0b259c8bf..dec9435b22 100644 --- a/Data/Migrations/201607170250191_IsFr8OwnTerminal_Property.cs +++ b/Data/Migrations/201607170250191_IsFr8OwnTerminal_Property.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class IsFr8OwnTerminal_Property : DbMigration + public partial class IsFr8OwnTerminal_Property : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607181342049_AddPlanTemplatesReferenceToPageDefinitions.cs b/Data/Migrations/201607181342049_AddPlanTemplatesReferenceToPageDefinitions.cs index 0de84cc049..eb85b223ea 100644 --- a/Data/Migrations/201607181342049_AddPlanTemplatesReferenceToPageDefinitions.cs +++ b/Data/Migrations/201607181342049_AddPlanTemplatesReferenceToPageDefinitions.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class AddPlanTemplatesReferenceToPageDefinitions : DbMigration + public partial class AddPlanTemplatesReferenceToPageDefinitions : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607190941340_RemovedTerminalIdentifierFromTerminalTable.cs b/Data/Migrations/201607190941340_RemovedTerminalIdentifierFromTerminalTable.cs index 031bbc99e0..f982d9e6bd 100644 --- a/Data/Migrations/201607190941340_RemovedTerminalIdentifierFromTerminalTable.cs +++ b/Data/Migrations/201607190941340_RemovedTerminalIdentifierFromTerminalTable.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemovedTerminalIdentifierFromTerminalTable : DbMigration + public partial class RemovedTerminalIdentifierFromTerminalTable : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607241524205_Terminals_Standard_Permissions.Designer.cs b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.Designer.cs new file mode 100644 index 0000000000..bba647a0d3 --- /dev/null +++ b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class Terminals_Standard_Permissions : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(Terminals_Standard_Permissions)); + + string IMigrationMetadata.Id + { + get { return "201607241524205_Terminals_Standard_Permissions"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201607241524205_Terminals_Standard_Permissions.cs b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.cs new file mode 100644 index 0000000000..116afe88c5 --- /dev/null +++ b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.cs @@ -0,0 +1,53 @@ +using Data.Repositories; + +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class Terminals_Standard_Permissions : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + // add use terminal permissions for all present terminals for standard users and for guests + var permissionSetId = Guid.NewGuid(); + var standardUserRolePermissionId = Guid.NewGuid(); + var guestUserRolePermissionId = Guid.NewGuid(); + + var sqlMigration = $@" + -- add permission type template for terminals + declare @counter int; + set @counter = (select count (*) from dbo._PermissionTypeTemplate where Id = 11) + if(@counter = 0) + begin + insert into dbo._PermissionTypeTemplate(id, Name) values(11, 'UseTerminal') + end + + -- create permissionset for terminals with use permissions + insert into dbo.PermissionSets(Id, Name, ObjectType,HasFullAccess, LastUpdated, CreateDate) + values('{permissionSetId}', 'Use Terminal Permission Set', 'TerminalDO', 0, '2016-07-20 11:11:48.5762342 +02:00', '2016-07-20 11:11:48.5762342 +02:00') + + insert into dbo.PermissionSetPermissions(PermissionSetId, PermissionTypeTemplateId) values('{permissionSetId}', 11) + + -- create RolePermissions with given permission set + insert into dbo.RolePermissions(Id, PermissionSetId, RoleId, LastUpdated, CreateDate) + values ('{guestUserRolePermissionId}', '{permissionSetId}', (select top 1 Id from dbo.AspNetRoles where Name= 'Guest'), '2016-07-20 11:11:48.5762342 +02:00', '2016-07-20 11:11:48.5762342 +02:00') + insert into dbo.RolePermissions(Id, PermissionSetId, RoleId, LastUpdated, CreateDate) + values ('{standardUserRolePermissionId}', '{permissionSetId}', (select top 1 Id from dbo.AspNetRoles where Name= 'Customer'), '2016-07-20 11:11:48.5762342 +02:00', '2016-07-20 11:11:48.5762342 +02:00') + + -- create ObjectRolePermissions for all terminals for above defined 2 RolePermissions + insert into dbo.ObjectRolePermissions(id, ObjectId, RolePermissionId, Type, LastUpdated, CreateDate, Fr8AccountId) + select newid(), id, '{standardUserRolePermissionId}', 'TerminalDO', '2016-07-01 11:11:48.5762342 +02:00','2016-07-01 11:11:48.5762342 +02:00', ' ' from dbo.Terminals + + insert into dbo.ObjectRolePermissions(id, ObjectId, RolePermissionId, Type, LastUpdated, CreateDate, Fr8AccountId) + select newid(), id, '{guestUserRolePermissionId}', 'TerminalDO', '2016-07-01 11:11:48.5762342 +02:00','2016-07-01 11:11:48.5762342 +02:00', ' ' from dbo.Terminals + "; + + Sql(sqlMigration); + } + + public override void Down() + { + } + } +} diff --git a/Data/Migrations/201607241524205_Terminals_Standard_Permissions.resx b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.resx new file mode 100644 index 0000000000..08133135f4 --- /dev/null +++ b/Data/Migrations/201607241524205_Terminals_Standard_Permissions.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201607261330178_RemovedObsoleteActivityDOProperties.cs b/Data/Migrations/201607261330178_RemovedObsoleteActivityDOProperties.cs index a40ec7c679..d7387ee2c6 100644 --- a/Data/Migrations/201607261330178_RemovedObsoleteActivityDOProperties.cs +++ b/Data/Migrations/201607261330178_RemovedObsoleteActivityDOProperties.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemovedObsoleteActivityDOProperties : DbMigration + public partial class RemovedObsoleteActivityDOProperties : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607271152557_FixManifestDescriptionTypos.cs b/Data/Migrations/201607271152557_FixManifestDescriptionTypos.cs index 0858a58739..0e9df24764 100644 --- a/Data/Migrations/201607271152557_FixManifestDescriptionTypos.cs +++ b/Data/Migrations/201607271152557_FixManifestDescriptionTypos.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class FixManifestDescriptionTypos : DbMigration + public partial class FixManifestDescriptionTypos : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607291915038_RemovePlanTemplateEntities.cs b/Data/Migrations/201607291915038_RemovePlanTemplateEntities.cs index 973f1186da..7460248ad5 100644 --- a/Data/Migrations/201607291915038_RemovePlanTemplateEntities.cs +++ b/Data/Migrations/201607291915038_RemovePlanTemplateEntities.cs @@ -2,7 +2,7 @@ namespace Data.Migrations { using System.Data.Entity.Migrations; - public partial class RemovePlanTemplateEntities : DbMigration + public partial class RemovePlanTemplateEntities : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607300016510_RemoveNodeTransitions.cs b/Data/Migrations/201607300016510_RemoveNodeTransitions.cs index 5c833377e8..77305deff0 100644 --- a/Data/Migrations/201607300016510_RemoveNodeTransitions.cs +++ b/Data/Migrations/201607300016510_RemoveNodeTransitions.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveNodeTransitions : DbMigration + public partial class RemoveNodeTransitions : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607301037088_PlanDTO_PlanFullDTO_Refactoring.cs b/Data/Migrations/201607301037088_PlanDTO_PlanFullDTO_Refactoring.cs index 3e992d1881..b4016cd45b 100644 --- a/Data/Migrations/201607301037088_PlanDTO_PlanFullDTO_Refactoring.cs +++ b/Data/Migrations/201607301037088_PlanDTO_PlanFullDTO_Refactoring.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class PlanDTO_PlanFullDTO_Refactoring : DbMigration + public partial class PlanDTO_PlanFullDTO_Refactoring : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607310758516_Standard_Permissions_for_Terminals.cs b/Data/Migrations/201607310758516_Standard_Permissions_for_Terminals.cs index 2faf1689cc..51536223cb 100644 --- a/Data/Migrations/201607310758516_Standard_Permissions_for_Terminals.cs +++ b/Data/Migrations/201607310758516_Standard_Permissions_for_Terminals.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class Standard_Permissions_for_Terminals : DbMigration + public partial class Standard_Permissions_for_Terminals : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201607311227053_ChangeRoleName_Customer_to_StandardUser.cs b/Data/Migrations/201607311227053_ChangeRoleName_Customer_to_StandardUser.cs index 261845192e..ee2537b796 100644 --- a/Data/Migrations/201607311227053_ChangeRoleName_Customer_to_StandardUser.cs +++ b/Data/Migrations/201607311227053_ChangeRoleName_Customer_to_StandardUser.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class ChangeRoleName_Customer_to_StandardUser : DbMigration + public partial class ChangeRoleName_Customer_to_StandardUser : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.Designer.cs b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.Designer.cs new file mode 100644 index 0000000000..8b2f0b3091 --- /dev/null +++ b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class TerminalRegistrationEnhancements : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(TerminalRegistrationEnhancements)); + + string IMigrationMetadata.Id + { + get { return "201608011644376_TerminalRegistrationEnhancements"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.cs b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.cs new file mode 100644 index 0000000000..6e43ba0c01 --- /dev/null +++ b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.cs @@ -0,0 +1,64 @@ +namespace Data.Migrations +{ + using States; + using System; + using System.Data.Entity.Migrations; + + public partial class TerminalRegistrationEnhancements : DbMigration + { + public override void Up() + { + DropPrimaryKey("dbo.TerminalRegistration"); + CreateTable( + "dbo._OperationalStateTemplate", + c => new + { + Id = c.Int(nullable: false), + Name = c.String(), + }) + .PrimaryKey(t => t.Id); + + CreateTable( + "dbo._ParticipationStateTemplate", + c => new + { + Id = c.Int(nullable: false), + Name = c.String(), + }) + .PrimaryKey(t => t.Id); + + AddColumn("dbo.TerminalRegistration", "Id", c => c.Guid(nullable: false, defaultValueSql: "newid()")); + AddColumn("dbo.TerminalRegistration", "DevUrl", c => c.String()); + AddColumn("dbo.TerminalRegistration", "ProdUrl", c => c.String()); + AddColumn("dbo.TerminalRegistration", "OperationalState", c => c.Int(nullable: true, defaultValue: OperationalState.Active)); + AddColumn("dbo.TerminalRegistration", "ParticipationState", c => c.Int(nullable: true, defaultValue: ParticipationState.Approved)); + + AlterColumn("dbo.TerminalRegistration", "Endpoint", c => c.String()); + AddPrimaryKey("dbo.TerminalRegistration", "Id"); + CreateIndex("dbo.TerminalRegistration", "OperationalState"); + CreateIndex("dbo.TerminalRegistration", "ParticipationState"); + AddForeignKey("dbo.TerminalRegistration", "OperationalState", "dbo._OperationalStateTemplate", "Id", cascadeDelete: true); + AddForeignKey("dbo.TerminalRegistration", "ParticipationState", "dbo._ParticipationStateTemplate", "Id", cascadeDelete: true); + Sql("INSERT INTO _OperationalStateTemplate(Id, Name) VALUES (1, 'Active') INSERT INTO _ParticipationStateTemplate(Id, Name) VALUES (1, 'Approved')"); + Sql("Update TerminalRegistration SET OperationalState = 1, ParticipationState = 1"); + } + + public override void Down() + { + DropForeignKey("dbo.TerminalRegistration", "ParticipationState", "dbo._ParticipationStateTemplate"); + DropForeignKey("dbo.TerminalRegistration", "OperationalState", "dbo._OperationalStateTemplate"); + DropIndex("dbo.TerminalRegistration", new[] { "ParticipationState" }); + DropIndex("dbo.TerminalRegistration", new[] { "OperationalState" }); + DropPrimaryKey("dbo.TerminalRegistration"); + AlterColumn("dbo.TerminalRegistration", "Endpoint", c => c.String(nullable: false, maxLength: 128)); + DropColumn("dbo.TerminalRegistration", "ParticipationState"); + DropColumn("dbo.TerminalRegistration", "OperationalState"); + DropColumn("dbo.TerminalRegistration", "ProdUrl"); + DropColumn("dbo.TerminalRegistration", "DevUrl"); + DropColumn("dbo.TerminalRegistration", "Id"); + DropTable("dbo._ParticipationStateTemplate"); + DropTable("dbo._OperationalStateTemplate"); + AddPrimaryKey("dbo.TerminalRegistration", "Endpoint"); + } + } +} diff --git a/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.resx b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.resx new file mode 100644 index 0000000000..59803ccb75 --- /dev/null +++ b/Data/Migrations/201608011644376_TerminalRegistrationEnhancements.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608021530462_RemoveRunnable.cs b/Data/Migrations/201608021530462_RemoveRunnable.cs index 881b0cb103..208d187dba 100644 --- a/Data/Migrations/201608021530462_RemoveRunnable.cs +++ b/Data/Migrations/201608021530462_RemoveRunnable.cs @@ -3,7 +3,7 @@ namespace Data.Migrations using System; using System.Data.Entity.Migrations; - public partial class RemoveRunnable : DbMigration + public partial class RemoveRunnable : System.Data.Entity.Migrations.DbMigration { public override void Up() { diff --git a/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.Designer.cs b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.Designer.cs new file mode 100644 index 0000000000..d8658b12d3 --- /dev/null +++ b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class RemovedNameAndCurrentViewFromActivityDO : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(RemovedNameAndCurrentViewFromActivityDO)); + + string IMigrationMetadata.Id + { + get { return "201608030857168_RemovedNameAndCurrentViewFromActivityDO"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.cs b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.cs new file mode 100644 index 0000000000..63b2b2ce1a --- /dev/null +++ b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.cs @@ -0,0 +1,20 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class RemovedNameAndCurrentViewFromActivityDO : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + DropColumn("dbo.Actions", "Name"); + DropColumn("dbo.Actions", "currentView"); + } + + public override void Down() + { + AddColumn("dbo.Actions", "currentView", c => c.String()); + AddColumn("dbo.Actions", "Name", c => c.String()); + } + } +} diff --git a/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.resx b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.resx new file mode 100644 index 0000000000..c36d702843 --- /dev/null +++ b/Data/Migrations/201608030857168_RemovedNameAndCurrentViewFromActivityDO.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO19W28cuZLm+wL7HwQ9zQx6LLt7zlmfhj0DW7KOtccXQSV3L+ZFSGVRpTyuyqyTmaW2drG/bB/2J+1fWDKvvATJYCbzUlKhgZYrGQySwY/B4C3i//2f//vmP35s1kcPJM2iJH57/OrFy+MjEofJMopXb493+d2/vj7+j3//r//lzYfl5sfRbzXdL4yO5oyzt8f3eb799eQkC+/JJshebKIwTbLkLn8RJpuTYJmc/Pzy5V9OXr06IZTFMeV1dPTmahfn0YYUP+jP0yQOyTbfBevPyZKss+o7TVkUXI++BBuSbYOQvD0+C/LgxUV8lwZZnu7CfJeS46N36yigVVmQ9d3xURDHSR7ktKK/fsvIIk+TeLXY0g/B+vpxSyjdXbDOSNWAX1tybFte/szactJmrFmFuyxPNo4MX/1SCedEzt5JxMeN8Kj4PlAx54+s1YUI3x5fLEnx6SpZUwHIBf56uk4Z8dvjz00R77LtF5K/qDO+KFmep5TdH0n6/QXP8acjdL6fGjD9/OIl+++no9PdmvXm25js8jRY/3R0ubtdR+HfyON18p3Eb395dXv3y+s//TlY/vLnfyO//IlvKW0rpRM+0E+XabIlKa0buWvaf3x0IuY7kTM22bg8pVQolui4OD76HPz4ROJVfk9HzM+vj4/Oox9kWX+pwPUtjugwopkoSunPL7v1Orhdkyb9xFgm+7+h1J//9GcvpX4JHqJV0fVS+XTgpNnx0RVZF6nZfbQth5fQ3zcV2XmabNhvEV9l6s0i2aUha0yiJbkO0hXJxdq9OWnBi4I0Y+Uf1jXX+UOb1VSFN0jKGtRlJNRFjD0a6voOWy4acWX/18jIzr6aIFfMVwWLiGQvlKw/HTGCFjKvsJCJaVOOj94HGamkwg/OZiwYxfqJTqHftssgJ41saWXINZ2Zv97dZWxEOnbUaUooA8akK0OtRirkBWokRaY3FW2rljQkim7S0fVSUCXTjlAZFCZ7CJFO04L/KWH+08G+WDofNkG09mDqIEqhy4y7KN20UH6f0AEQxM51vgyyjHbt8mOQ3RuqTv/poeoLEu5SCqhFHmy2g5d2eZ/E5Mtuc8tGzXhleeua6z+S8yDMk/RDzHL15vcpCb8nu/xDvGRq6lseyloLzcBLdd6FIcmycwpmsjxN6Cq6ZngR57/87MyOqbKplxqn6yDamNcarJo3NZ262OCStasNngaazU01/JSsohhRw5pOU8My2VzDisa1hnrjSOCu2EVqqrl6Hqwhnl/RH/4n54LtU5+hdQOeE+OCqkHyVxKTlNlvl0GekzRuewCjHKawCIruY4UOPgEVJf0WrHe+i+qwlCzq0m0pWWUdbilZjtNnsFAo1K9/hVSwnb9CKqpJPz9ES2b9ITaSamLKHkUP71HZ1Z5Us7E1ktDMsQsfRw2jh8t5+poaocz0dFFWfK7h9JRZRZ1HaZZbrF0/8wpThqMUdE2yvJJr75XFA11UMHqFEWJl/W65TOm65OKs33KE/ryL+K3ev+4iVVuok3iWDb8Kz7mJqFvrvqarII7+ZzFOFDtu6H3VwadrlvU/6Xq+xYC/vtCue3jwgcsfXu/ciNTtKkhLpCyG9JSuKzYeDGDNeQJaWFuyUHU9VVOjuu4G0rqZ2MpX49Qu8YZQI+wq3SznmshVxIvdbRam0baooL2uErmmxgKVud4iqWvt2XxWKJ1rstmui5FvawGQRdMKhdLcEpW81xYAP3BcjAgxXz8z4gmu10exOBr1OfiG4dwXmMb9OBJG24gUyhoYtSKQb3jqdsBqiZSxqqd0Vpk0V8ENVW+eWlvvlshWb46yl3pp2u+iW7hMB8UCWVmKbd9jWYDIehmkeUS7JIhzfisQxWCvVEV1/qkbbWb1AI92YXzBqsObgd1TlYFVNio9p5pLKDKaUpwGuDFnbhuGzaOoPnTG/oaWs4V10IBKWZ8pHIPVIGtbxXK4IymJQzLClsbu9u8kzAcv5+P150/X5MfwBV2ugygepSSm/ekQJtGDtymmGHpskbXLnCY7poz67rsxHqOsHq7Idk1VxZhl2Rcs/vZ898boeJfnQXi/0S5Q2vR6fhJuUyqpyjwOkHSawMsBYZy3aysHpFftJYAMXphoaF2XVB/iB7KmXwzmEyuppQKqXCfqK9pQuFaPlTbEWs9i2AGrQp9raxerWSdTyzIaf8TPDQWH030ul98Ds8IUWp5Ha0LrY97SH+UORhLntJUjmFbvk128DNLHD5tbslz2v4sHL4sHWAg6a2PlWrteYXeCNKxrLdAuNpCzFzV99gLi8mxWHl+S2AqwAcwk/NKxmlGcVo9NnmfTjdgF5HmS5CPcqP4YxMv1COXUw3WkSw5lYWekOU4bvMxuul3ZNaA6lg2EupqHJYjLvifSJtbteqpWc7frgfFDlFeH5nhVyOfya77Ve3pm1dYU77x5Xr3EKDKD2xHdL/ornI3rOl6EN6a83HV2XBb1jjsyn+viSuwGfGt1+TQthcnNrdTk6WcWmnrJ2TrUM3s21sXcjUQtUJ07G2Z06Oi5dLT5QKzbyk/D7tDpM+l08cIg3vYR8z2b7pzVNa1PySr5lpreVXvaUwvC76uUbaydJutkhIXnPdmMs+rcq8WUcDt4iMvEsi2JuHfcSedUd31d1E2TZc80Tfm2wa9fKE/n6GmSkzD38Hh+n8bQJUk3UcaQsyCaYSSQwNfbNSTKLoWOrtdehcTUYQyJGQ8jydNI+lrcsBnlHK3T26mPQXZOxVZ6lXimox051Hl6w3BvyZQ500TrurNkeoHTQ0tZq2x4ioNfTLZcey4jYUZ7pr2e7gKSfwDlMhuJ+Z5Nd2IXkGdJ+P0xSJeVxe3lbbjtBI6OszhY21tpeTxUzDOfyANZ92O0V1MN12rjEYAI+xswW6vC7dSKNkdkcZ2HJCwO88pStp0RDzKx9a+RjemQllbbCzWJTfQNXb+JFISI8ywKcHk2OnfuU2gNFJfps83zbLoRO3UuSJiS4Z8HeEKM4xRW9fL4BX8KbomPrWZXjxMVzjvdUlBuaS+3SRSP8HJkxEtM73b5PRsXoe4myJO2upTGG42vVmnemHK2Mz8qg2IH4HK5WmHiSMC2U5cLbCNMbGqfJkcXPxhs9jO3paYC614mmupaUfS0xgy4cTfKtMyezaQ+d9tMO4CcOxtmdOjouXQ04FjHuY8VHofunUn3shdIQRSXEwh2kcVl2rOOnO9p2eU6iHvW04ObvtNdmtKZ912YRw8UKG4Hal/Ij445T9mgYSMoWB0utygvBIuhZneHxo3KG1221kS0Uys2IyKLq4Fb4Y2B/wvtQHu7ZHpNg0Qyc0skWtcmMNRfJbucoBogUcPVF4iMlRcpnQ9S1wHsf5EvoiSCK8rSjPUrCHrfqweh3OVOPcBozyawp2uJ1APQ6epOk2fPurHT/H6VJI2acptfLwNexbnlbQ+cRjhs/ZouCf9c8Bns1Z3eR+sl6xbNXZwG4jdiLwpXWnRE6tU7LaXr6WGLC1u9eUqwzi2BegkHpHKe6AKrldFTzoZ6a3oE7fKDG/W2mou0YL15ElOtBbp+PkCqJYGTB5Amj98HpNwkYzkSCdPHLdUf0MrkfRQH6SNuZpzVusfPSZXtmkvZc7V91XPOY1vBSVpdti861m32KqrTPKNshVy4FpHTetxyERsNezJpMH2j0nMuTfRkqm8TA62rnlElbW0FkANuh0JobIlK7UX/NK4UOuihNu9zMDRHemM0hjq6DlbDu7/zd/lgPufnXwhZZuJBXN878vJg8rBf6ety5imtySpJH9X5gda3TXStHf/2gedYJrh6VIniyyAmv0fL/L5fa38ntwuSPkQhUeT2hBZWINxQM3Sr7ZVpVbuf6ppXOwOiGTjvtZYwjnSRxNXy+RzGlraEmGZx1F0ve2BbAF1bNZBham+8vmqqezvqsLXncxjr3xJiWsBR972CaxwcHS7jGvjtmeH1dDdq5WnR8bklmH3POrfbUlZquCd2nhbaezm1t5aZQaEKQLtRs6qa1ZxDq2It2ZwX5C6bCj1nbcWFNWqO96I++uiO56E4LMr+55cvPaz3LkIKwKBdWTyf6xdo5LZ2kwtm+Vx7htYn4g/oAG27Ulb2XJ3UMpB7z6De7UCeLKOUhPm3q0+DY2tBVsyH+XUahN9pCR8e6I9RRo9UcJUajRCj58OPLRVv9i6XsW/PyLRQsMbcW/BVVaHEUTqmLvOMDtEoHrGRZYGjtrHcCSiPmAYusgg5bwrI4NmtQE8/26ruhbbVLTyWy4hlp/jNaXtvd/kIo/si+0xR9Kz87mj6yrzAA+ZW4IhUvy/dIb+6wu3CxO/eLlQDcHfXRIhrWOcdXsNzPbAg9eGegQxXd2+P+Yzw6vSiz8Bxz4zFp7u3y+5HuV7AneqOlic5OU4PY57BM0n4OCQPhg+/8VuURbfRuljyS33JJ/U9lvdWfeObCPusXOL+BiAWL11CNOCtS5Cwp6c5tXLuTuZkHgdNPRNNvdjdbh2VdZNlr/W19Q1kmlPWtK3lwyWX5YXDq9nNZhdX16KKWB2rXVr5g3Z5Rqvn8mzGGXanWBAWf7EKtcI9hMLVvC6VhGp5YKrH642BFf92sAsH4IVhJzZ93yFqG9jhKaKG12HYz2iKvYgzmjt0VetCtkOHTmEFDLdumLu2x9uPfCRkvAnJ5TpAW3m8Gq3YvuFIhi7riZFeauwryOtDy9K3lJMfUSnnDMAOkp1TFESr+JrJqgSD/xFieR+u1KD3yZnr/lbVV+6rAqGTn+5LCLGdZheJEu5vdHk5Z4O4LKoLQmQ+53MkDg7d2qpbvqAy4NvpcXGi6yV3b3wgoxlov8Oun9DRPRegEJtDJ8+kk9kZ7rsVtTkv4rvExWiRMj6bDsUa6FfkHzuSse3hMW7snRF26fc82ETr4ReiZWEX2WIbLUkTirLrrZqvi5Gq/XXxOfj7CKEzaTlRPEo5FJTh8DeNq3LGaVShUkYCRFHWOJgoixpPguMgY6Tri3u1/mEyAVcA0oR5UxK2Bj+Urtj3IFEvc/5jROf79PEiJxuX6V/Idpj8ZZVZhKMc4Zr0efq6GITDl3SZRpsgfRxtt3tBwiRejlniabLZUmt9hNgk9dPC4S01OizHuAbB7WgddoYVFXsehE6v1kt6vxdnRDWPEMvy/eMQU7v+ekBdKhzarhDJDUfEBbST0pRJUyHoNWFexGHEpgG3Y9o6z2S9SvV3knI6B7MB7+LZPyRbJ5E0WQ7GwxSn1tX2xFP2yfRhE0TwA48GezcVjeBxnE+CHI4L6b1Uyadk5TJkCvLDcJHK+kyybAyXpuMcf/Mhew+mlDJiPvzY0oUVWV6RjNrqmdN9EjXvYSzJC5MsS8KIZS1XsPwp93CrIanQvq9UR9qV8hENc3YD0TSfIk701SF2oz/LtxIrk689R5dXlNiWyBt2GhJMrftv293IXHufxpsZPhtVOfcD2yaEoRDo3D1otZj/2XQvdib05eyXF7OH55X7NWHIbUcFzBWBeWNgosagxebVhqhFM/DqcEBTOuRywEKKbdgQbgc0RekjBoOE2BZ4cT5gAJfz/Knl9Wx069ynzibQiuAhojwjQS8itTz2rJs7OSEb4DwJb/gEmM2yb3nx+v9FQb1nXTK8VUPrMrx3hmC9G2GjbG6GEP40MFqTMlIIEsr/PYni03WQZexosMp8QLZsXwWr3o9L2EuzpC+X2QHTZM2xJsPnrRXObkoK7rCVT1BPWoVUZxuZ+Y4xVaYgAOpC/6evCkvsZSW6vls8vFiEYbxOdssq/ty3dPhDjvqFJOuOUc5uzpLw+2OQLmtPoKYt6Oc+CV5SEJyRuyiOXPev5JyHcSZr0Shf+wC7u+OvrC5t7LKpOvFWtKWVfg7E5uwHjo6vUdQlc5nUbJ+M1H37qzDrXbArsoqy3N3/E5x/dOX5IV5u6XJGNQqtKrTN2ftcd6CtLetFbD/nzhfZefr66x9xuztcFvgsvBprz2thfCtntgYy7cYzROu2oNhtuJGsRAKmHbqmk2cjC9zOs8Sm573Sb/GSpOvH6pVubaaInfKZbG5J2kxJQVkBhppiy+ft8UulH4Us75QMr1QBlqKyiU+IqYSXHx04Ly7iuzQonSZRsbxQRMqx/okC57VE/+XD9XhC/pxQKzdJM53AZPorEpLogXAZ1BudQgY6ukKSZXwRv5hznCfpH3SNw5fxb+Yci2S9Ky2Xiv5PPXq9tL+89zgjnry3aZ3Ygxft8JDpPyXJFtvRSif80qETZAe73rpBZLx3HUEZFoEjdJ0BC7e+9kZb1FyE234hOZtf2ATEvHcUf6WqUkPoqHLKDtO3E1n7UEAhpYYJFV60peKiIqe6+8ULtZX2oppYbnJRmmL+RZYMJwWzcOrlL2NczMF6uaikkEh4Krmar0TelPvX+IysSU6O3hXO9pjbtywMlqrpQvt66VAxQIA1VS1tiwxpCdS+JinLFKxPE+YRMKCGsmqMR3EYbYO1VUpSTuQuCGt7U4accka2JGYFWiWBKZzlgivQlCN1ik1CHYBY2IGn6yDa2JHI0ZqgWFqro0KRr5kFiwXVwGAEBDUiGgFhYEqvF37Tw/FTsopiJBxL2jnCsaqZBY4F1RhwFAU1NhxFYewXHM3mi0o6RzBq7ZyRp2lVSmMjUZDE7IH4Ls+D8H5TPLqtnvlpjVuFFDShOSp7Xxu5A2gqElTGXhHeCX/66o+AP33PYAovMrBj2EkAWPVoWW3pdYYOK4Y8ECQ1oDGh0VQCAEuw9pilYyesISo3AugQnYBGX/1IbFoExg9kTaunn4oVSge0DTQJq1WCtGaViBkD/RApC2ZMHMoS2B/dd0VoSyPK0w69ltQBe5ZdK4A3AKImdXAUqW0cEUaqEOaPo4v4IcrbYCvxXZRumjMvxHyKzA+uO7isLhMstkhosjW0cHZ2oWM7x1isuHU2pkYqlzkMhPYHA4/bIIDzDjYANMVB4Ne0ajBj06GeY4PX3Emo2ggcJgItN7GWxvQli5fHxBHnKORiGUDwdZrVOxSpXSzpGjkYkF2rPAKaXTsObYlIfKY0b6sgfw5WLpRDa+w2xF1sXrCk6UxfU8PHsoBNIkHDr2Iy7bqqbcmCci0+oYHX5nAH3pALfbCG+G3SYcCqCmt8sKriwNSBXXicDKTn6evqCUyt/et4qDoIaHNAIOWJXWZ2fSE6nI0zEjoh1dqYEZBq7bW9Uatf01UQ10/5v960DdNDVp8FwqxI7TijG4oCkOs2PDqBz972EdBnlwqmEjyXyY4qL9lF84xdbVwQNpba33r8GfJAAJTIXfSmqSRoEdSmm5Y/3S8CKvVJkzv2SBld/5J+aClVpQASqpKQeqDTCLXUZoThaZE6pgZVlsmGpTC/2VAGEQ9mvUwLLlNVxjY79hBWkh8r2hZq+hR+f637YfasEORkT4F40CHKg2YAqEmzs6DxbRsB0/iOxVSGyz4Rxuunc6wtu/yeMQ3xBxao3BDS24wuKMcVBwJd37bZ4d2plSNA3qmTUahXuEwP/sZ3Ie642ppzENBrioIAr2nPnMFubt24QDd3KqYuIofpAV4590SgTPbu6RHAkitQpLWtGsTdjbjmLT7SklLdtQ5grik+XlEyn37wWpoxvjkm95bLQJ3H6pVvEHIbXsjiupK17GgaCgKw6jog+i9qwbaPvbQF5YKphOyHbBYIZDpa9LCMAoeSbbA9FbUkyABSmzE79Ylr1dho1nYkpiKVo5RJUEzz5zR3YWE0/8Yh2Z4VQjOXywXMiMI0V06hJs0O1fjmjYBsfMfOHd3M88aXZEmEEzT9UQpEDR6kNIROZygg+95mfedDFFN1xjhCMUkbU36ba7qjzbYNlwHjWX/AYEzMMQjOpCKgAxVtEYMgDa7QuGiD5Y46WxFyzgF1V0nihDmefhDECQVMjzeoOuOiDZI4pgZ8vulemdcOxKp5vzi8ET/hbEVXRuALdYWH0zt11xrAR3+mxs/Oquza5hFGSFdAoI5KIEYTj6Da6WJ5XUTx8mhDrTm7abQIObsMGEvRkIs0iWaOu7BurRtxQOB62mUY1HnnNItUdYpM7v9MubrNDwNd8TfXFDFAkGPT1xyginEaha8KqYt2nxOsrQdlhjyjmDxdD82GguIEp1+ILsDUYvITMKAdv5PbBUkfIrkJZky0uUaBIFccAMI2dcgVIqpa02BR7Q1MPdpck+MRsOStaATymLDYDYNQIYbJeSQzohd+DU0aEb2G3tuvCZ2PeVq42K5u74kfkTseHZiBmAf4OKG/Sz10t0FNghhOWfdowRijoEdHo4YHzGpOY8Ru9ppyjYb6aY1fTI2mgmsvA3iqZ61gSyw3Ng15RoOhr/ucXpEoVmoqHIo9galF4YR3MgRyBpDSHJTRq+QaxuxVi4EMXwTY/S/BjNUb2YjV9ka3eXrSA2J20E3/4IxVXQbdEbH78TDIHXxfrVR6dqsvW3tGQK2twzBVaDLP4erhLkVdnzHkGeqyoVTKRHcaEFUaAXYI8WNqUWWtVe9kepJvzhfyI79KdjlB40/IMRD6xDJmgD2wQiMjDxQ8pg4s46xAx3oPhTVGOBDECtYaZM1x71NX95FByPcIdradEHObzS6u3g4XXn9Xuybiq5CIesHejR2MXz0nN0B3qhH8ZEAnjgEVbJ/ajwL8Ph2OMglkJlM9/k2D8HsUr8oXyGxHRPhgf+OOyw8+FJayOj0XRhYLvnqHWzgY2h3rOgK8HTsNtTsqcJgbmHF+SjC5RwOyVW+DbRsfxFP5G3HpLBcAT6iL2d7uuxXldRHfJdXusBatEDEETonOBZtgEZNt45tqMwLgTPKe/cb9eRCy27WnKaGjYvlef/9aJgTfZxc0Ti+zZa6TgUhXkxEApBMtylqsM02GIJo/JFt78EWJTrOGL0kcV/ACX7wzca/7QlAdxlmIQ1LFlHxF/rEj2XRPRj/82JKQYveKZFvKil35w0ZPtOUEfd4rmZzCKVqLBOOESLnm7k4L3coRkI3uZExdpg3PqLbEaMBp6EcB9bSWnKVC06Bur+y5xm+c6NmK/4k7CHdlZHL41t3TmXMtIC2sb/zsFHDX9o6xru4ICJR6lpnMa/RYb3Va8o06NvbVGyCyOdMhfS/fRmnagnTnCeYaFc0TuPw8j9bkOlhlN+fGOAA8FbgZUhE4bYcITKFGgy7/px+8YMXH2DqBegFTbiHIZDqXiXW96f/sEKP/844wxhOaIYLVrPHFVXtMeHE9gFL7wWpyjX9FVhFjxClSq74H8pi0vUjeRdtDBU62+kRUakTrw9AX6FXoOBj8QPPkj82VIMk77dktSyE/aI+GuyxPNkEcJ2XI4l9pJU/XKevo7O1xnu7U6ZZxXpC8cQW1JlTdlZ85fFyw5tBPLB1AncikJmYSsjGsaaxMGaGNkVPNTtdBtLFxLIic2H5KVlFsY1sQWdmKoRNBMcrRFS0cuSi1IDshii2mdqZqIXiUe+rypq3CDiaz1S9+IGs6aHVVbJLttTxVgtebKmuitpWkC92ulqKjRElcG1lbI3otvaU0MbQg2A9yQEcLxyYqF8iMi9ll4yNGVYO5yUHsbLLVBexTpaqjtJQgrt3ASssLRFudwRBTaoVBMgvvdjMErCm/V2KtpSE+EFBZA7WtJF1gFrUUHaWtBMDzucocILLw5W4Mg+IW7m8jNB7ozBrUdiClbfw1jwngoce9NbBwUp1ogBwhXxv2sWH0wQiNEmMGZEsEX13GxkhevRz5I5kjOPOudECeoq8dWz2B16FwTcFnpBhdYvQuASsUYxbrzKA+NQQmBZXIOub1l6U1SsB0Cd6uFbT31SHFoCW2mdNsbbQLDc0QKOyzZp6kZHmuNxt4AvusJl1/hOc25V6qdd7RXI0G5h0NJbYEW8fBdIjlGXdHDxSKch/SwvMjXZ4zZ5I52Wg4ChSYGbK8yqObH+u7URY+dPWm4VGk2FcmyhE4vEIBrh5YrXvLfRjAvrfkQNp4CMtUd4Rha5PhdFltjoHYul4M08ctlYSg7M+CPICXjzpqu8gCHXyqvWFL/nZXWmHQJiF4aCqBVIOXwYqckbsojgxdLhOh4STuzRnhJO+RSiVwW2qchZFtv5C82Z86Y77Ti30qjrq2MTSk8q4f5w0DztHs8zZtBnfKlO1EO+N6P5djDDIT9hcpGUJQ/L7fTbUFp8oIoNK3QiWGJGOXBsAHEIRVwj2EUuwY19uIeqnwZPbmcNSQXKo+QMiFZ2QRTN0Gv5Kpd0ItkqnIkA0qqT1IpmJkkUzdBr+S0SobgArZHK2KcRSLVqMMMZDe5XkQ3m9I3F5uhzSwSmXQkQoxJBR5RWBSuipDQDrcZnhvqVS84E1vVTwmcn2zDLkggWnbh2YKCA21rd9DftUOPzjSVCJEs2paDxJqWEFgEk4uvMmjOdwxCoSjsjejJe4vEo4XZNCIJ1f99XFzfFI8K9ef2ABKGpnVoHFxHLrLFFsANCgdjq96il13hGURuSYbUhpwbk+i1jCHxIw8v3MXMTdSLId3qpzRefXywLIAjX7TIO9WinbawR5pdtS3zZk8Ru2CxBaNCeXRoli4RGDTxSDnEVSyVPiCci4+YeTGEaNb1+bxLTeO88C2ohAZmK8FJDM9sb5l2jzd1hp6djpBGbqgg7zE2wZcNFBQYAZqfRP1mSCRqTckDNIzsAbEB/ZGB5lJ1yC4uwug0Ezk+qYZckFiA65vGORmYg5NEMjbGR5EWd5XQYmxInVoZZljAPFVjAHRCddz/Go3g6xAOqQSMkjJUZ2NJhbpBQd4NUcVEiKXvqH2zOA2i3IoZJAloghorGIuJrmLuL2bZLxMpEoZl1EvBVR+SNbiZSuDnHElgKLGX6vqJXHdxSqjtDWZUHKA8/qSsoY7JGHklbJe0q1eppmlCT1f07VPerTWU1rSe7QB7Bnd21O7zoSfqZq0mPJA1ZN2VN6gIqXedxLmq2FfY4jUyGlUyORhWhb5AfKy9UNfmQFXOS1yU3Mg26pk9CA/lSekuez3Vd2lKLgA11wzVSWJyKVvuT0zJFHp6q1Bsgj+mj1ZzCXbDguSNnp82+ngcgQkNKwZIHpwKSJcBDatQkCOQ6572wIvAyFkgFk+EjGqRWIeX3KSuEILEwPXfiK7ShKswARSVMP4HL6EJfAcXlSuUenBk3FXHoZjbkdWkNThm/ims3XXQuEFoMud++4dZY6WbuoeS067fHCB2qGuUJ4SIHoDF6feVNpwQ4QL5o4bD7ro7zYcAvHfPSMdiNvu3oF+pGpaAqFDj9vaa1oK+ZDniEsiczxsnBB1AbRtzQRCaHsWJBA1mytBfurjTZiA8jeJEiK3NxPI1ct+wAR8duyeLiLsEk0Ykm3vqMSicPrEJealpnkPZuqXPqGI5T1Pl5dfnjrPqJHxcXHtMjFqZU9yH1MzGwK1YkVp3fvERHYdQIzD74yag4xalLElKqlWberjkvZVyPpQpM6903EtfAZFxtQshkFa88oVytJ7OQwyBU/Jrc9Ve275SYEabXt9priO+k04TWTH/rt7mmCOw+0o6EMMWiRniEeobR4ckbC31OAghOPIjLG2iepSiaKnbcolH0evt2Au+dB5Q8qjU/Q2UGr948BJ0ugVCU7oAfOreWOX9Ar+Ju7pY9/HdzjuRYYWgw6Bu0QlEw9zHeOS8dYg8LbedGzsGIpMOGrHvaL3KHvr1RH3EFo4aVivjniSuhXyKM8C7hIHgzcBArYHeRLaaQzzJFnfkusDg/SMkZ0GsOmV+EPQ4bMxRpF4NKyLUsRVXfHbYDpq1sUnGkAUciAdeK7Xx9qRJ2cw2o4407f+JszzPBhgZ6j3hdawMNB9e7dYMkL78NFk+BaDTjJMd/DRAWSEtyBu7i+8SFunn1BhTGxt1mkpH/IcWlc5x9YwXGLrFp8DvJXmHKED2N9yuuzVOSgHj2y8JxRvHWXatXSK/ICRhmnn0qfUR9y9NMcSwAsVfXvTHH5gIIEOv48pBhiADB59BALROgFjEHA11jncMXAB2q1zRNCn6czvvanlil98uMq8Z/zO7eZd4fOgqh0heRs4kEt2w7CxenAH4Wzy4Q4MGdWVEWLImNy29xgwLFoAy9zsLDVpb04W4T3ZBNWHNyeVUboL1p+TJVlndcLnYLulS7iszVl9OVpsg5BZs/+6OD76sVnH2dvj+zzf/npykhWssxebKEyTLLnLX4TJ5iRYJic/v3z5l5NXr042JY+TULim8UaqbVMSXV4EKyKlMkN6Sc6jNMuZH67bIKMdcrrcKGSq43RRfo2A6/J43+hq3zFitqKtqdm/q9fuGfv317t/YvV5QRd8aVD6LdylRHCa9M+Ax/mK3TltKfM+UjSacH0vuGRXslMGizBYB2ntuJ7znX+arHebWO9LX5+b/V/MX35RObw5keovy+1EEZyLZCGBlu6xil5SJ7+ZCvQTrf+37ZKtfUU2QgKeX7mOPiusPJ4d/x3kRkfCsnDSdvRbsN6R2tlYLU2B2VnEpnOmp6gEZ9L55s6buu8V6YrxFEYVbp3e6jeU9lP9P3nXhDXrPtqwiSeB7sQ6jgffCbrYHnourEyZS/1tFgNEcR745IW8rzqX76O90bt6SDw9VGm1eRvMZh80us5Rpwct3leDj2V+VecAPIPqkyOPymmWrFHkNDzXyyDL/kjS5ccguxd5iil4jgsS7lIm7DzYbEWWUpJDLe+TmHzZbW7ZOluoJJ/QiZ9GojAFvoTrPxJ25JSkH+Lgdi1zV1MdphW6qkx2OV3LM5X/LQ+lyUVN7sAbqLOchudauk44pxAly9Py4R/PGEjG82ajWF0ttl9nMXkJUe/cNRaoQPUi6aeqin0NVaLcZzcLSGXVfnUYTiTLm1ejwkjiExwg+UDhxoAsQbH97KiYK/dRLFy8opi5NAcVVbpykTuT++xgOa4D5qlLMBrLTw5qPVcMT02Abz0P3q+U3DA5bQS7eBSr/TrakP+kc4mMDP77bEw1wFn3IHZbwbuv8VbGTBxJLfpZAhRVZjJSBmP92ZFXsTAAmFXfZzH7tavNomq9dwRG7fd9WMTXYt2rRbymF2eBBOPCuwrVug8rbyDCgM8uLKPL9utCDQ/9AoWS028P0VJeCkpJTpZWkedv5FGxtdqEoaaKiaCh+DztCwwpQrA7KmwMpj5p1C4lake4wkKi/rhvM81EcBR9PPfFIh9e2h2IxtwD7g+Ca0e3ReMwS1HIjznAW6E4YB+vip1xb1xrVSy7rLDqkOojIf8zRWOwUlbH3GeHAxZyR1ISh0RSxvx3hw2P3e3fSShtNzUf8Xw+Xn/+dM0u/wiM2q8Ohgq1PGOVFfcZz4uNAaroSPQgDzkxxVFLlNfaAeVQJzhsRKbJRoZF/c2NC7Cb2Xx1Qdd2/XidqMyEBGd+oPkgpz03TdplYcLFR+myJmmyj7bTLkZmkThJaQ4dpoTVkToOSJ/NVCjFS+u988TFVOuAiTb7aJhQkdCh/3NaY1lzcp/xvN4nu3gZpI8fNrdkuZQ1ipo6nME7sEIxGlM8KLtYVELU75Fw9DWNVux+tzpbiSku5z+sFSo//vtzm6Y6ajlkCEU3XYdhigArjs3UezFTrdT4gIm9N8waZl1WaYbMw3TOeZLk8pZr/c1hMRTEy7XMpvnoch+ghKYKGTHFneMZad6QwYwFgvG3eD6TdMUUWrDIU4oQedlcJR50MVYXOwXWdFTJeN4YzezC7ZkqaHzMTseexPHF9CKW03PtQcdwoF2MJCR3tLWE5vdM+1SJPdi3G0WGHfrNxmDqjjIcfyffUukmefPRYWEfhN9XKVu/U0aJZI4piQ5G1D3ZQDZZ+/lglqCGDB/Ir+9oaXh1GCiGvHMdI/RnXjiUUS5z1J8PGMRhUAne2RuJIscueLRxmCsqvxbnhur2Lv99msvhH4PsfLdel68w5IW5kHQYNzgTtgWpX+MVxxdjtmI5TT2apjqGkr0P9e06kWGXMwQLg2E6qnZgUj2wkZkByS77baUHGpkp/931iVkRnRd6XFYlHBQYToHhYjY7ai8EU4zqQrF5pnpLcBPXt8NaZh26yZR5mM5ZkDAl8m2t6tuYht5vJM2Us4Pmo4sGupV1WfXJXcdC90DkNIeTjHi5TSL5IWb71WF+0Z21dDxjUQOHS5MBkH6YE5BzgkuUedepAc0bNUM4cHumEwU+ir1jT+L4YnoRy+m59iAmdrdj51lZYvoNweSZdpkYkKVvb3HcOnSTMffU/aPd9VoHituA+tu4jgyqoEt1EDC5UkCyg5zIDy1jOc3F2AhYyOLCn6lsbvApB3MIp36bAeRZB+P4YhQxltPUo32q0w0+oJVLtxnvCrdcu9wUbnOP1U18MHrVN52Y5qCoAz4knaKylVSX5zyvNZuRYorLTeklUS/StV+fm0LsoLTaWJhdHlmEoz66+RCH6eOW9oR+QtSQTDvX9t8MkmNCy3KE0t22XsTwpgp/kMKx/s3lR3lnR06cxcAow5x2nAhGGxL9DXPf+3hNxFfV1nc21Yv4FMLGZ+Ck1X+Lsug2WtOekbZ0ue8OqoHWfpWkEq/26yxgu9jdbrsil+bdM/BSRKU5bVJVc2VlKCbOxn6V1bWfB5MK044zuo3JXMHg5dSliFcjqRynExZfZ0i+9fIXQpaZuL0u708ABN1NFN1Er5JMde/AXZ9r69X75e/nKL4MYvJ7tMwlV85iCp7j7+R2QdKHKFSMRTHlua2Rut+rAMDr84aFA3vUSZobw6mV+sQzcT3qfd2WBfn2mI8tfIbpPblw3aqTT5/LmvZZKyu5YwaBtBc875N9eREmdCqW5+f26wGcKHC25ocXWPLsOgDSnP0AxScNRXVb04+mBNh20ZUoNgOdLZFllJIw/3b1STpY4hNcbngWbbxOg/A7bfOHB/pDHQZ6qs4lVamR7FfQQOZwIPFjS4WRvZOvU7afXXjlJKVrWM0RGZDcmbcqeJDAnf9Zsgki5fBATe3KWV9xPt2de7k2YiMM5s6n47kXfqMlpyH1tw57HhIn/nufox5on0ZH5FDOsnTCTiGV52l0u8vlAQhTOEyB2Wfa45KOq74dpj/kngbc0X4vBzsUgNrXcGU5tQ032UvG+sTN4yNGG0tMByKYPNMuO002m11c7b0XHoNWu9Sf5w0T+07XUF3YDdOlQh3UXXgg2WHihd37PmPPvt3vW0rd4PPKJZI1RjM5MHumGuoiLmXvSyUJ/Dp5fjbmn7qXhj95fNaKpV68l8+M/DyclVh2eT5rZTEMLM9pNaJVfM1CYKoQVVMdZsKqRcAxt5DizhF83CqlHQYDbpYV5ebxWSCKL2Z+xXKaWm1P3YN+TSQMV5feOxhGQN+xfb13K1oclX7iZSaSOHboMSuHoY4O/rEjGbt4CRweCEkul+HYCd15sInWktEkprhyvMgWWzUaoZzm8CBlAdWx/erC6XPwd9m7Y/PRiU8UA3zKjy58LoM8vJf5VB+d+YCV4lMctpoZxCGxCwmO/ADh899duamt5b87cgM6gv8+9gHFs7a6PkZZzm4+5WTj9zGiwLjLe0SBwWihSwqPiDKP9qvTY0EoFiv32eFJShptgvQRXnUriS5HzWFSRNGBOQPJTjub2yQmsqce7rP7TTv4fp3TrFmEJxDmSseABdCK77mu9DpYhedB2O0i6STqoBTf8v2jEtGKTwD5KWG8q5aL4JtjnPQ4jFiM7P3pJaoBk1RRD+1XXP9w7Z59H1nEPHk3KcIVCxxXvt095oRk6+c2fcOrm7ccXd6p9yosK2jFp0P7+bnNlB0x+ClZecFfwacD9jT5hsFdFXZZej1Wfxz1IabqyvfgxNcFtx9+bItwB1cko9Z+5ilmncK0S+w6BJNh4P0uy5IwYt2uc8cPU3QvQTZaofSxN1sOyyc13TlKlYRh78E8nfhjjl5cOU5t2EzsQtt7CACYcQ/X2tOEBPD7fJ5vA+SXUU0+KCicglJE5083oVlj1JIDs2eqkRp3ZMKtddYzPmIQ63h3sescmA3Tl/it5alml8DPYrLg02XugPMN0xt/I9J2YPEBn7/YtxI5VJ8OkwAKbefRmhSuh3qfGGgYIRCnzzqQfRKsFNOk/ORwbsgiHibKsWHz9QA/NPy8aLvzrtErdRkHOqlaJ7tl5dxTCdKqJDociKfRipnWrDWqtaKmOsyXUgAvaWsBSD5AHwX9S9rLZ+QuiiNv60eZZRevolYWA+nkKF/Ll77LT056PVvkqqNmV9d6dOxBbByHZH9nbd5dptK+VZVD+9WB0zqI60UYKHKB4GJ52DV03Vu6IquIDmx/rzJhxj32lmyMdN3hLzQYdHHL/dbWRXaevv76R1y3S37qL6cegCwm18cVZbxlEc3vsu0XkrM+uUrWJDv7elP8PbY5ttFlU97lsZsg9AdLBkbIUjl5AfneLJJdGkJbU2jYqZz1QNQcxidqrGa4vhBX1klNa7sL4jpIVyTHCgIz4xsr1t4/uci+7Nbrt8d3wTpTjtuwou3KDxbqmxMQ2XjwX4pxyLmAytYBYMxqiXeODy0to8JQquMQUcJ58Jw94NdU034YhoXnVuXeyGkjoxZYZ1excJM7lwEfbRWQr8Kvp1QrJh56Xq1ZP2QOo7O07fUGDfFkzxEmmszdThENnQSWMzsowbV8YrCqrbgm4pdM0piJ1Zfmd1Z/qHamPidLss7afIvwnmyCQg7ZNgiZPUopzqM0yxkGb4OMlCTHR7TxD+yp29vjxWOWk82LAqSLf6xP11Hx1qAm+BzE0R3J8sLv0tvjn1+++vn46N06CjL23GF9d3z0Y7OOs1/DXZYnmyCOk7xo+tvj+zzf/npykhUlZi82UZgmWXKXvwiTzUmwTE4or19OXr06IcvNiZy9Yovi8vIvNZcsW655nHBLswYdOjP1zd+IAoUaIlfk7kiHpjcncsY3ACJZFd4exw9BGt4H6fHR5+DHJxKv8vu3x69+fn18xIDGHuo3YDsxsix3CWSmshB/vYiX5Mfb4/9V5Pr1iDWa/av4/BOF97c4+seOJlynO3L0v4Va/fynPzvXSlhMlZVjP/JoQ5K7u4wUsCJhlBX4+G88f6oYrez5xZV/7tKtas8dpjedXTvx4n/c6JgBCaVB/dNRESHt16OXUi9LTcHISW+0j9qSV64t4RfXKBVRF95FTWjXRSqpbslj0yo98FNmxYIChe8eGHCD6EERuYimE+j3eF78sAmitZGrNK9hOqRgWri7SzctoG6j3Ll6l0GW/ZGky49Bdi/X8p82wY9/dq3agoQ79mRrkQebrReOl/dJTL7sNrdEwV5ffl5EeP1Hwt4FJumHmOXqxetTEn5PdjldC7Cx/C0P5eHs2tiGYe+qvQtDkmXnFHhkecqOc2tmxca8IzM2qLtZjHVOPxZjJ210ug6izfgqqZBzsQz/K6FrNDaVXAY5cw7dVq9TR8xnzi4kW56EehjoBbfqxpcHdocpvM+g+ZSsorjLoCky1mt/lP1aE4PXBdGmsX1oSjXzbDgIrfDMe8pRj0ZPYeRUfm7lncW91bfQpNdJGzUOgDv0IS/Zm+pvu4yd1zYMbt7orDv7APSKstxGgJuFvUVnAQx2TY8rA4unizNRKXRY0VRQ7FiBJnfvelyymL20b4M4540Rp9pIPPrU6WmOnkJKT2bkVG/cW+j2Uu60qSQlcUgU/d5tTb4r3gp74fXx+vOna/LDD7NLaqHH3rgxBFOdTKKHgQZKAdn6pXMHnVBm7aMKztNk464ey1y6clFNZyy82S5XZLt+vE5889OYRGMv9mascwutt4ReNeyt4q2fL3gDUykjb+yeJpB4fQZfIhsNUOMswPBmTfxA1rTEJzPAzpMk97Tz/jGIl2tPvGrUeRuoNUPh/YQHvsOsqZBGaboi5QvmgybTjNeb6gwoqB0IHBSaJKCL+CHKLeGInq1woLX+QUS8iL6mqyCufTk8lUnRn3mYrJLi7aAHXu+D8PsqTXbx8jRZq6c83WbFe7LxN8c+zSmEVuJuoiXVrtinL3zeRncRM62mAjL9mRf+wXpdf3ia+BAfpDxnlPBOEf2Ajo08U0sRpnbDpc/O3McgO6cZylsyhzGgGEqXiIdnz9VEMr2h2VsTSXb+0e26gcLF58Vx3ueg2+q8zdlrgV5qi8ovsVsNuKy9qvBE1Q0nnoOu4SWje+q5t3pmQcKU+DlARMkeVanfSJphNhCRQ/SW2FeIuLvK9bPGToeYYu5eaqd16eHj4Nfzli3zP8nQyMdsd9TOCofno6RV9tzT1I43Dovc3ad+h3lD6bjD9CEISNQBB+EIwmFQNTghfq5yad6VP+/ND+b3rO9WRcGi11xS+UF3m8+KTL2KPd2lKW1qHfCvpxwUbn22br6QH77qJbLqU6lTZh5XXhUOe+9a1XLT6JaD3lU3nqm2+JIs9/Nk4ipJ8roBPUelyKrPqLwMmNrxVC2ZWb+Loa/7bbTxDHzusRWcCheg3cfJ01Rd9TzRXDzax1Hq8WgYs8mB2tUtPPp6YITdxJlii+ILIctMXKz2OXSSsdjJSASZ9DIaJ9+gb6Nmd9deyv6R6y2+KL4MYvJ7tMzv+/D5ndwuSPoQhcRdnHzew1Mm4LQBQP7BFoVmu3pE7etVCLkdPW1AlV3PA0URiJ5q17J7PtvYnZG9l7CGhr/47PvlS1dlfxEmdObK/fgVeprYaefVJ3Me621FcICPXfXwgfIKf6h7qXyuyDKi0sm/XX3y84SPFLEMrtMg/B7Fqw8P9Ic3WErMq9TI01PtDz+2VBTZu1yGkTsjNo6DtXZXqGP1BK7ehFrzPaMGSRR7rmzJ1HtdSyOfDTovbOs43B1PyOWnYp5uxjm/W2tz9jNkFc3WbUsCZtNnCftuWfripoMgz9Podpd7GvoX2WcK08PVYfBOBtCJh/W1eMF6HRzkAt092GyogVJukRZvPVc7OC7V3lrcQhO73FZTGPTRjwc/HKhTa0niEw/amSwC8Z4l4zJwyVMaxt4MVPnQ4jAA1Vvw1eqtvMXoC0Ig2TlFSbSKr1mlyy4ed4JVyzfs8nVxJlrLssvMw+ftNekI/dm1Fv39cz3N0SIJ6GBggsKZwTQ+M9GwfYl3KzodXsR3yZOZp6/IP3Yky2mP+9qvPCPsBOA82ERrP5N2yfAiW2x519RdthS+LjxW6+vic/B3T44pKK8o9saLoiL0c9BQ8fJXuWIAeeyEgp+/fijZ+W2tv96Y1abq0zQOPkZUlOnjRU42T0bFl24qPB1DnKevYX/7HV1eRJsgffS6xluQMImXvrmeJpttEhNPbzzrWxZ+5kdfPvHE9cbzWWjr2C/fP3ZUt1x+nzqXDpck5WAjmcmzDZ1ymsQh2T6dyALeNrcq69v9CmuT8bC+l8H2KVk9GaBVjvj9XLL3BVrBw8vzmSXwTpN/bAvfcVckoyZD9nQuw9WRt8nSs+czmbF0UcOxmrNaJnXbw/Xgk+Rpjq0beXAdNnH1XpGepCe2yV9R8VLt5n5AZvB8xjmsrPfEm47SbwetI8aKCNPHLYWhcMOt2JwYXT69L3F33FPBq+jg6SxSgJie3V4ozyG47YxtHxbpqHgO/jRgQ5vSYQ5nmfrF/mLOzRP3kut8z2eydgLmk9Fmp+tkt6xcFfmKZVCH9WKC8rYNIzsTVla8B9XZ+g6inXlG7qI4elproShf28GE1cb2kx+cRe9p0KB2l3DGnGd3JQxN3oYxe+lQLySyi+UzPH5z3te4Iqsoy/u8e2gd9rqOaJ2r3/2JYo97vXWevv76R1xL/PCOyxIGxWNECIEz8lo2XHqXGUspXbegxriEE3n1spz1LXQz43V8HCqHf9Ce50F4z95XT7VmQwikZ794OwNiri+JNzP2PQscFqSPHza3ZLnsF8dptJiXDg+G6iCGTxdYYqBG58KF3L1c1yoRNd0fJMochsAEMwImQIOToYI3UpBbOWnmz2sDs1O8MbsmWV4tzPuonncPVIcweg0TdMje6hWruxZjsLrhWTQ9+Oqno4vsW2EX/Hp0TSvSZVafT8iz03Xg6ZXvRD7J+dCk7tpazN3P1/egB4ZDLyeuKaP/TGLSyRBxcmY9gbbuNLx6TuQonTrNPk7tZMJ5EVFn7Gc6BysvzfiNYv02WuvvBXdyDjuU28xJbNYpcN+ch0PBD6hwb6OYLlC6rZX8h1Pw5a963j47Vec7fesHMOzlj4m1t1kpEPyAdgnPeZh8Ohl1KXslW4kPb9TrOqa+80qbXfd9tv1CcmZwXyVrkp19vSn+Sh31IV4ese/tsVGdo67TgqzvXqiJn3frPNquo5B+fXv88sWLV0qbVd5avhDPf1EYUugQFhYiCtZ0Fcz27CmSVZxFcRhtg7WuXVIGEJr19rm8WQoSM67gzupJUxc55YxsScwqBgkIU6bau05VhsEBN6KpqzRUbb3x5oQDpRmrfPNvoK2HnlB6Jcv0zdf4jKxJTo5KI4IZLFkYLNWBS8fbcpAh4xneaOR4QqrTcJoFuIq9B7oujzY4JajtzQnQVVRbW6EqdXD1OTa+ynb10dfjA+xTsooUc2j+ACuqra1QlfrkAFa2a78Ahrfi5oSvqafHKdDV29ocBVzFbjw1AIu/xvdPbc+CxHzvwgROa4aqXgLb5tsgWLGLYBjM1K3CFMVVcWq8xA9kTaun10UOPTiQBqrrKFeC+zwIklx6tC942rag8cMOIybFzhWhbYuAmyydwGNRJE1hEjfh+77DgG/M/HHA1bZUupdsO4w1NM4NF97kCUiXS52JtJR7giQHKc0IX1J9p1Q61XUDB93T5FBVEJe0J/iRqj1XwHD3SuYAlQXlWnwaACpDWTyjW83jQ8tlWj1Pk81kcNLf6s5uFskuDfUTnJRV6E8lbRRkIa+oGyqqzTIILmUpjQDMLrf4NTWxX9ufGsDXQboiud5CQ+ADCYgDoI0S3Vdgm9+WTIXw8vKnXi+X6bJGbr86GYQ9tLwvLdnUfHwY4fDS3umdBCCi16Obd2FI7ZzCZ519kQoRC/oPJBhF+UnOnPhayUnDKDOrIIeBoMmJlaZErqYTYbB+N8nwt8vvGVNrdCQehvo8IhoNdKOAsm2nUDH+80BgREp1GExy7UPhUans9LBsfMQhz4809AIcdTRPG4oYSc4ChmJFp4dg6bxNC7nyVhnfl9UXJ4NtKlgAd+JmAQLO394crLPGwYC3/nui5pdjN49vdPF+OSdB1nn6unpxyTaCuQbo94L9qJipoTGaqumACtlJ1VTgYN4FaO5C9zX/Njnx5EwfDb1g+uhoRtFNXOOEWgnfhzF+MLIcBox84zDFVe9pptmzWgfxl2RJKPhaLTWwVmrLFDepuM/7rY24lmBKawU/3dZlC4PLgPGsP+g3L107EQ0KxmdcYDj2lzd0FC1FbVwKfTIHlFwlyQEjs8II3yOTIUR+FFvscoufkKaNOZu0820kHcXQURsu1BFKHmovHC3uYaALNBW1EwnVe2IU144HyuM8+asWuzKhBgt88qgYFZplrNqQp4WAGEZEp9hCF4DWOeekY6s6RYYL9L0V1LMCpaPymhyUk999AEA5xAaq3jacywQ87m5oR7xOviMKwOV3crsgKYunrgVMSyL1rpjgtKaYC26EJswXOW01p8OO4timussgfsSuMywZlVsNRmI36AENEcEHEgx3bQEtwIEgCTUXNQvCdZ8TPkeeDGeErJEnxK4YaqbEqS74g7AZ5SLCnNAy2h59Z6DUMVynPyzcpZPs1E93pjfuHqzrMV7VH7VhNYsD5S/kR36V7HJyQMgMEMJ6Y1bwKPwFmlCRKYBQJpf5AmGUecQVA6xiE/b9ZrOLq9u+hfP/1a4OVnQjJOJug+uzSFdQtGSOekVffQlfJsKh7pugxDcUCg0NRk1ecu2nuoSbBuF35sy0uAnMFk7CB8RtcJhevA2uoXG7vivVVFy2KYkD3fBGSGcYxCktRC2yhExzgxhO54HUILx6aLpZgWv0Nyx9oDWh7mIrw3cryusivkuqxfvAS3epSIWfkLbfC3a5ObNfq58HIbs2UAYdWb7X3xfwA4WPUZazY+mcbCQgSCn7DQOxMSjTpu6AKXdtQrJtHFSN4KesKVFedtVf991HWdsUTGFX5B87kk13vfbDjy0JKQavSLalrNhxJ9o7ppTV6CjTQjuO1yClrSKegeSB3JyZpTECSIG2Ykqd1iWnCtUR7Ji5gGa0aawjNCY1aJpXuuJDSf4n8tBdn0XQZwayUR9uG57R6UiGUWlIUQ8DWU1TURpNrve8ELw3T33nBshxz/Z7AHDyC28a5I3qaGAuqBndAUEHwEztjOA8WpPrYJXdnJs8iJ2r7sPOQd9hA+mjupZKDcqPg6DnfDQXY01DMGUV1UqmxwsL3alVBMFKHvfllycLlrJ9c8MKJZx8Iroiq4gx4iaikaYhsWRwGpJJnsY0JLUKvd6b7KJ1ngfh/YYUbktYL7UMb5gv5BsW55UsS4V8c53ctBn075D4PKJDEiHB4a4rV6hwaZH/jgBqJwwJlR4BSloJOxU3NnaKfeFXWkhMH9ulA4b2b8vcFTvThvW4iB+ivJ6dIOVTx3+heqel9RRASK9t+KKEEGT896G0zYhg0YrUqbixcdL+4O8s6DWPJoO4C6mjcYta7I4bX5uGmvrPEURCTecAqOIqXboJ6o3L9vzIACp9JsUzl5ZunKCK04HS0PYZAlOt7VTLfN6TIDQrCuE96dSIC4DtGOHTfB+p60qxE5DGjsnZd9E4Nkb4iDoWC3xGkYeQMNrbqEN4FM0ilJWAqCqIgh5MfsNajAuFUUNY4FEwdeAKAQCs2sLhs8EUUmhFCwhIfoL6BWjmrNA15Yn813QVxNUrXMEHqWG2EvMI3SgnzVjVSFWdFSL4uk3qbVJj5XKOKKmNC7z16/O41eaBEvEm0p99O77byZlbtxUq2B/sJKTQSoHj1ORxYsbhsOQt4pvSzFkBqqneVAcW1btslMYpu30knVMXJrulGnSreVy9A8rTqahxESI7z9Irnzm7XUSCau9dK2KRNTtniqBfMwPWfPjxQbjLGxk3XR31jIkcpY5TRjHaYg1nSjui7dyUJoWheVIWNCxSp7K8g+RDsUPeOCppzjSW5DxKs/wsyIPbIFNvmbJcC5I3lS132lk7j4/KVODEoExehPdkE7w9Xt4mtLuD22JAZdsvJGfpyumJtjC2ZLUU2JLoC61p3Aq2FGor0K2w03UQbSwlVjTmYgsit7I/JasotpRd0ZjLLojsZctnCkrBMgFUKk+D6NgrQsdvVNxHAgoUUqHSGgJk6/TNMrbHzl28JqcUISZD5bQU9sLK4yP5bFopFCaDCocpbQKNH8ia6k5YplwiKNYqHdFY03m82mYTNdh0UwZb1XR3UNRq6SjBKumIUbC4DNI8YpNinNsqZabXA0WbxVJBeRtYqZFMAFWBp7GjhzvfUkrj0qCCqmREGXIYd7UkmQIsjydCjIuW3tbPOkqwh3XENgUoPVFSVaBEACpBIQijVQJgbHW1+SAZ2HaQ0lIL/rWhUjafCJVYp2MaawjdDbTZQA033ZDBVjVdGGe1WjpKsEo6Ylt1gONLtSYAEVgJgM5SvuBFUSlYSIVKbAhwUyMYRBKcFkFK3ZQIEtv0ILf+VFUglwhqvyrd3mpoc04pDiICjWSJDqN0jGGtIPVjzKBRRMY8SAlJoVm0QpLoTHLiSJ2rgaoDtgLW0sXgE0q5YjJUYkuBwCS4hac2FiQDm6tQIqcIYxwEeJ4wZtFOFsZcVttFPdwDzBaVCLZYVDqrijY5IgV0tokcVuK6HCitrvXLCil2LbFGt2vpbVsTbHNrF2qlJKVDpXMkdjmo/hRV80ohAY0sgQqz5NR5IgUMGg0lbNBoiLHVsWEBpjNWxQkBiutCpQoKBVS4QGTvDclPnlKmlA6VWJFgTLfaExtkuNVpGrONJdub8ylZgfyr7xBvmoTY3wKcManbMgARuD0j0WH2pCxezoDtB0sOeAPCkgm5WrMuV3WEplUcT2sXmMGNkiorAzEoJgO9dVsvTB+3VMLCJM9OI8BtPj0xvO2np7f1XACPm+o72C8BYty0rg4U1m0SxL1NRZQAVt20H4zbCb4MVuSM3EVxpAWySgIuvwQqxOSscQmgHUcyoWkc8bSuu2/4bTFsRuteXfsDsVDgny6r6wM+FVwW8ARWe417LgZYa1wqbKtxBAjDACqk+q4zAhD4Lg+hwd0EDeMqCbE2hQXTpOhWoRiBtOfn0D6oofZtqlQCd4jMtUI8Ri0CwBdqg6Oum6Uhlc+54Vdo/GEvLR5KVE7MVU5aLhAH4dycUiPEwbOrntgBkgCoPFfdnxh7CKF4alifOuulwJPhGqFtAFoMwqG6wqZK9SuI+gjcIoiKbCxBCCf8Cpsq1a8gtAoCoBpLDGMMi9ovBXjSrUrDRK5vlOlgvmgY5qBd4CjdWiiYNN/8CaU9jTeIoiHyUl0xn3KXoMzKffbWWP7OiL61HJX/5gK3Xoq8wvfeDea4Wc7tVTGg89oGg+U6AjcqkLcKJhCkeO8JAyCQ2IIj5eZVCycuaW7CWFC+9R0pqzA44qGFMazi1K8ds5tFsktDcFAhcukbpLllUjRMSTMIxm29DLHHXhHxK9brIF2xQ0c3sVa5DFoK0X5kg/dXzOVNJ5RsK1JDw+UbV2Xb2q94oblgvIMYJKfP4OUfVSKIXAa0Ga4slVBDXEESOMIb2QUvOam3wNrbTMbrQqrMcBlNYrNefqqkh77FJPBX73AV7PjPPoWnu9hkFJwmk0Fo5mtZpcBwd6ymFFbli90sHMhhu1BpYYeyqC+4ATl6Q3UhD+yKB46O0K8Bk2kWwZOJdAtUlYSB2i8CxhSBEENecwFPFQUil0FDmO8PlhoCdxlQ4AvcgCx4Cd/7WzHto7kWEKANAxL6RYp697E0WrjPPhtM18p0mqs/WBotEXtshCY3q8AoYrhKEqwQBNJ9F4F6u9V2YxQ4EHLlYbRqEXdia/vW4WarUIr+3m/BGUr2JmjhhuyNehdVL15LTntz1duzQnP5ZITwwCvBIENfqywAZ1URkeak0phhQHzMV2Ams9BEPpRpOOVQ5NrZ3tBGCobLoG8cdHG8aJaYMDfxAFfL7fe0Aal14WNZuSPupLfLd4d75aLQDVfwS7GDBMMI3jhgjRkGG7JzEo9+TW8i92uxTyUQYcW2S212vIl8KDN2nPUb37Iv5Ed+lexyghGDSPx0hMAqZmt7QWNucqa01jwQxmqo/g2N6VEKJI5OnIzbIJYHN/VOCPLpjCRe+1ujSt4mwv5bqtJbGe1rFGCjFZnVtBdtfFFT7UWjnseIc6LmjVA5MyqJwwnRegKCyogQoB6emCc9kwpPehxUBrcDZAXS+Z38NS+ZmtxCWv/d7SBki//TlNAuWb4H9wsUGr8NBh9RFXmlFB8zWvlOqrzVo5nQBBIvtzjkOU18yFXPaPXX/tdglJdUN4hbhdZMBg2Ae2BV6gK3V1KiyLXvyErpA8lDCFOnHHSkfofLFELQxKI2vOTSH4mieRjwZn2fVkIN/dIMXMwaTth0JEMJ2rRmd4pQ73HVPkMx2c/jEcHUvZ3NTyEYMQg4NJfro4QLjThX70md2y9JyQ8Wm3zgY8QezWMxq02tU2Jaiz3Ev9csO6T8MmHTTFGWDYC2BmX2Bmf4OaUAZ5mk/w5dn3jC0Baet/jE4l0MwMNieRNDSDDt+KlvL8uNPsOjyp7irELs2qQEReL1YgeP0+SuQWGhV0g+4st6ER3wfLbIa3oX21N0ujipNjmh4quKxp3Zc2Vp2eHcUE4tNFMsUJvg0HFE5f1Cm0fSesMQ61p0AiF2jFlpu46H52QQQO/Xhcg5uK/YxDCONtEYgj6qGqv3A5iRRNDEHbS1Hg5QKJ5e9Hg6MFJzgSh7tobbAvOJukXrvLJUKVZ3lCMJxRQgDhAIOp6cUH3YX3DRDjlpEiFcuoVC01xQ7BpMzeNZJ/LYsLuILtW4YHppAMSGAaNQS0+3bM4BRxJEp0BWhltNTnyGwo3kRWVR327yY6EYIzuZRWOJBKU0wu+9wXFEAoQgsgjFFrTI//2YEUXTKcIO/MzGnc9QA0z2I7Sonp64aiUWdIzlb+50NGlvTko3RNUH+jNP0mBFPtPKrbPi65uTKzpTRxtS/jojWbRqWbyhPGNSdGPLtKZhR6h1gB2pRjVJnVx142eSB8sgD96leXQXhDlNZg8io3h1fPRbsN4V9vEtWV7EX3f5dpfTJpPN7Vrw7ciC9ZjKf3Oi1PnN1/IBkY8m0GpGtAnka/x+F62XTb3Pg3UmTT86FiwK0F8J/V6tHVN2x/ix4fQliZGMKvE1wYtqLZZ9jRfBA+lSN2o9fSKrIHyk3x+iJVuJ6ZjYO0IU+5uzKFilwSareLT56U+K4eXmx7//fxmjE5xbUgQA + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608071558594_DiscoveryRefactoring.Designer.cs b/Data/Migrations/201608071558594_DiscoveryRefactoring.Designer.cs new file mode 100644 index 0000000000..c57ce3e55b --- /dev/null +++ b/Data/Migrations/201608071558594_DiscoveryRefactoring.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class DiscoveryRefactoring : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(DiscoveryRefactoring)); + + string IMigrationMetadata.Id + { + get { return "201608071558594_DiscoveryRefactoring"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608071558594_DiscoveryRefactoring.cs b/Data/Migrations/201608071558594_DiscoveryRefactoring.cs new file mode 100644 index 0000000000..03cbdd6580 --- /dev/null +++ b/Data/Migrations/201608071558594_DiscoveryRefactoring.cs @@ -0,0 +1,131 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class DiscoveryRefactoring : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + DropForeignKey("dbo.TerminalRegistration", "UserId", "dbo.Users"); + DropIndex("dbo.TerminalRegistration", new[] { "UserId" }); + RenameColumn(table: "dbo.Terminals", name: "UserDO_Id", newName: "UserId"); + RenameIndex(table: "dbo.Terminals", name: "IX_UserDO_Id", newName: "IX_UserId"); + CreateTable( + "dbo._ParticipationStateTemplate", + c => new + { + Id = c.Int(nullable: false), + Name = c.String(), + }) + .PrimaryKey(t => t.Id); + Sql("INSERT INTO dbo._ParticipationStateTemplate(Id, Name) VALUES (1, 'Approved')"); + AddColumn("dbo.Terminals", "IsFr8OwnTerminal", c => c.Boolean(nullable: false)); + AddColumn("dbo.Terminals", "DevUrl", c => c.String()); + AddColumn("dbo.Terminals", "ProdUrl", c => c.String()); + AddColumn("dbo.Terminals", "ParticipationState", c => c.Int(nullable: false, defaultValue: 1)); + CreateIndex("dbo.Terminals", "ParticipationState"); + AddForeignKey("dbo.Terminals", "ParticipationState", "dbo._ParticipationStateTemplate", "Id", cascadeDelete: true); + DropTable("dbo.TerminalRegistration"); + Sql("UPDATE Terminals SET IsFr8OwnTerminal = 1 WHERE [Endpoint] LIKE '%localhost:%' OR [Endpoint] LIKE '%fr8.co:%'"); + Sql("UPDATE Terminals SET DevUrl = [Endpoint] WHERE [Endpoint] LIKE '%localhost%'"); // for local env + Sql("UPDATE Terminals SET DevUrl = [Endpoint] WHERE [Endpoint] LIKE '%dev-terminals.fr8.co%'"); // for dev env + Sql(@" + SET NOCOUNT ON + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:39768' WHERE [Endpoint] LIKE '%terminalAtlassian.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:46281' WHERE [Endpoint] LIKE '%terminalAzure.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:61121' WHERE [Endpoint] LIKE '%terminalBasecamp2.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:53234' WHERE [Endpoint] LIKE '%terminalDocuSign.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:19760' WHERE [Endpoint] LIKE '%terminalDropbox.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:47011' WHERE [Endpoint] LIKE '%terminalExcel.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:22666' WHERE [Endpoint] LIKE '%terminalFacebook.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:50705' WHERE [Endpoint] LIKE '%terminalFr8Core.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:30701' WHERE [Endpoint] LIKE '%terminalPapertrail.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:48317' WHERE [Endpoint] LIKE '%terminalQuickBooks.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:51234' WHERE [Endpoint] LIKE '%terminalSalesforce.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:10601' WHERE [Endpoint] LIKE '%terminalSendGrid.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:39504' WHERE [Endpoint] LIKE '%terminalSlack.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:59022' WHERE [Endpoint] LIKE '%terminalTelegram.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:30699' WHERE [Endpoint] LIKE '%terminalTwilio.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:56785' WHERE [Endpoint] LIKE '%terminalAsana.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:25923' WHERE [Endpoint] LIKE '%terminalGoogle.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:39555' WHERE [Endpoint] LIKE '%terminalYammer.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:10109' WHERE [Endpoint] LIKE '%terminalInstagram.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:54642' WHERE [Endpoint] LIKE '%terminalBox.fr8.co%' + UPDATE [dbo].[Terminals] SET DevUrl = 'http://localhost:48675' WHERE [Endpoint] LIKE '%terminalStatX.fr8.co%' + SET NOCOUNT OFF + "); // for Prod + + AlterColumn("dbo.Terminals", "Name", c => c.String()); + AlterColumn("dbo.Terminals", "Version", c => c.String()); + AlterColumn("dbo.Terminals", "Label", c => c.String()); + AlterColumn("dbo.Terminals", "AuthenticationType", c => c.Int()); + AlterColumn("dbo.Terminals", "Endpoint", c => c.String(nullable: false)); + + Sql(@" + SET NOCOUNT ON + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalAtlassian.fr8.co' WHERE [DevUrl] LIKE '%:39768%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalAzure.fr8.co' WHERE [DevUrl] LIKE '%:46281%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalBasecamp2.fr8.co' WHERE [DevUrl] LIKE '%:61121%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalDocuSign.fr8.co' WHERE [DevUrl] LIKE '%:53234%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalDropbox.fr8.co' WHERE [DevUrl] LIKE '%:19760%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalExcel.fr8.co' WHERE [DevUrl] LIKE '%:47011%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalFacebook.fr8.co' WHERE [DevUrl] LIKE '%:22666%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalFr8Core.fr8.co' WHERE [DevUrl] LIKE '%:50705%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalPapertrail.fr8.co' WHERE [DevUrl] LIKE '%:30701%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalQuickBooks.fr8.co' WHERE [DevUrl] LIKE '%:48317%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalSalesforce.fr8.co' WHERE [DevUrl] LIKE '%:51234%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalSendGrid.fr8.co' WHERE [DevUrl] LIKE '%:10601%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalSlack.fr8.co' WHERE [DevUrl] LIKE '%:39504%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalTelegram.fr8.co' WHERE [DevUrl] LIKE '%:59022%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalTwilio.fr8.co' WHERE [DevUrl] LIKE '%:30699%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalAsana.fr8.co' WHERE [DevUrl] LIKE '%:56785%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalGoogle.fr8.co' WHERE [DevUrl] LIKE '%:25923%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalYammer.fr8.co' WHERE [DevUrl] LIKE '%:39555%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalInstagram.fr8.co' WHERE [DevUrl] LIKE '%:10109%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalBox.fr8.co' WHERE [DevUrl] LIKE '%:54642%' + UPDATE [dbo].[Terminals] SET ProdUrl = 'https://terminalStatX.fr8.co' WHERE [DevUrl] LIKE '%:48675%' + SET NOCOUNT OFF + "); + } + + public override void Down() + { + CreateTable( + "dbo.TerminalRegistration", + c => new + { + Endpoint = c.String(nullable: false, maxLength: 128), + UserId = c.String(maxLength: 128), + IsFr8OwnTerminal = c.Boolean(nullable: false), + LastUpdated = c.DateTimeOffset(nullable: false, precision: 7), + CreateDate = c.DateTimeOffset(nullable: false, precision: 7), + }) + .PrimaryKey(t => t.Endpoint); + + DropForeignKey("dbo.Terminals", "ParticipationState", "dbo._ParticipationStateTemplate"); + DropIndex("dbo.Terminals", new[] { "ParticipationState" }); + DropColumn("dbo.Terminals", "ParticipationState"); + DropColumn("dbo.Terminals", "ProdUrl"); + DropColumn("dbo.Terminals", "DevUrl"); + DropColumn("dbo.Terminals", "IsFr8OwnTerminal"); + DropTable("dbo._ParticipationStateTemplate"); + RenameIndex(table: "dbo.Terminals", name: "IX_UserId", newName: "IX_UserDO_Id"); + RenameColumn(table: "dbo.Terminals", name: "UserId", newName: "UserDO_Id"); + CreateIndex("dbo.TerminalRegistration", "UserId"); + AddForeignKey("dbo.TerminalRegistration", "UserId", "dbo.Users", "Id"); + + Sql("UPDATE Terminals SET Label = Name WHERE Label IS NULL"); + Sql("UPDATE Terminals SET Label = 'No label' WHERE Label IS NULL"); + Sql("UPDATE Terminals SET Version = 'No version' WHERE Version IS NULL"); + Sql("UPDATE Terminals SET Name = 'No name' WHERE Name IS NULL"); + AlterColumn("dbo.Terminals", "Label", c => c.String(nullable: false)); + AlterColumn("dbo.Terminals", "Version", c => c.String(nullable: false)); + AlterColumn("dbo.Terminals", "Name", c => c.String(nullable: false)); + DropIndex("dbo.Terminals", "IX_AuthenticationType"); + AlterColumn("dbo.Terminals", "AuthenticationType", c => c.Int(nullable: false)); + CreateIndex("dbo.Terminals", "AuthenticationType", false, "IX_AuthenticationType"); + AlterColumn("dbo.Terminals", "Endpoint", c => c.String()); + } + } +} diff --git a/Data/Migrations/201608071558594_DiscoveryRefactoring.resx b/Data/Migrations/201608071558594_DiscoveryRefactoring.resx new file mode 100644 index 0000000000..bff5467180 --- /dev/null +++ b/Data/Migrations/201608071558594_DiscoveryRefactoring.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAO19227kuJLg+wL7D4afZgY95aruOWfrNKpmUO3LKe+pi+F0dS/mxZCVdFqnM6U8ktJd3sV+2T7sJ+0vLKkrL0EyKFGXtBMNtCvFYDAYDAaDZDDi//2f//vuP75v1kePJM2iJH5//ObV6+MjEofJMopX7493+f2/vj3+j3//r//l3fly8/3o1xruJwZHa8bZ++OHPN/+fHKShQ9kE2SvNlGYJllyn78Kk81JsExOfnz9+i8nb96cEIrimOI6Onp3vYvzaEOKH/TnaRKHZJvvgvXnZEnWWfWdliwKrEdfgg3JtkFI3h+fBXnw6jK+T4MsT3dhvkvJ8dGHdRRQUhZkfX98FMRxkgc5JfTnbxlZ5GkSrxZb+iFY3zxtCYW7D9YZqTrwcwuO7cvrH1lfTtqKNapwl+XJxhHhm58q5pzI1Tux+LhhHmXfOWVz/sR6XbDw/fHlkhSfrpM1ZYDc4M+n65QBvz/+3DTxIdt+IfmruuKrEuVFStH9kaS/v+Ix/nCErvdDI0w/vnrN/vvh6HS3ZqP5Pia7PA3WPxxd7e7WUfg38nST/E7i9z+9ubv/6e2f/hwsf/rzv5Gf/sT3lPaVwgkf6KerNNmSlNJG7pv+Hx+diPVO5IpNNa5OyRUqS3ReHB99Dr5/IvEqf6Az5se3x0cX0XeyrL9UwvUtjug0opWolNKfX3brdXC3Jk35ibFN9n9Dqz/+6c9eWv0SPEarYuil9unESbPjo2uyLkqzh2hbTi9hvG8rsIs02bDfonyVpbeLZJeGrDOJFuQmSFckF6l7d9IKL0qkGSr/Yl1jnb9oM0pV8QZBWYe6zIS6ibFnQ03vsO2iJa4c/1oysrOvJpEr1qsCRUSyV0rVH44YQCsyb7AiE9OuHB/9EmSk4go/OZu5YGTrJ7qEftsug5w0vKXEkBu6Mn+9v8/YjHQcqNOUUAQMSVeEWo1U8AvUSApPbyvYVi1pQBTdpIPrpaBKpB1FZVAx2UMR6bQs+F8S5r8c7Iulc74JorUHUwfRCt1m3EfpphXlXxI6AYLYmearIMvo0C4/BtmDgXT6Tw+kL0i4S6lALfJgsx28tauHJCZfdps7NmvGa8vb0Nz8kVwEYZ6k5zGr1RvfpyT8Pdnl5/GSqalveShrLTQCL+R8CEOSZRdUmMnyNKG76BrhZZz/9KMzOqbKpt5qnK6DaGPeazAyb2s4dbPBFWt3GzwMtJqbKPyUrKIYQWENp6GwLDZTWMG4Uqg3jgTsil2klprJ82AN8fiK8fC/OBdon/sKrZvwHBsXVA2Sv5KYpMx+uwrynKRxOwIY5TCFRVAMH2t08AWoaOnXYL3z3VSHrWRBS7etZFV1uK1kOU9fwEahUL/+FVKBdv4KqSCTfn6Mlsz6Qxwk1cAUPQoePqOyqz2JsrE1ktDNsRsfRw2jp8tF+pYaocz0dFFWfK3h9JRZRV1EaZZbrF0/6wpThqM0dEOyvOJr753FI91UMHgFEWJn/WG5TOm+5PKs33aE/ryP+KPev+4iVVuoi3iWDb8Lz7mFqFvvvqarII7+ZzFPFDtu6HPVwZdrVvU/6X6+lQF/Y6Hd9/DCB25/eL1zK0K3uyAtkLIZ0kO67th4YQAp5wFoY23LAul6qIaimnYDaN1NLPHVPLVzvAHUMLsqN/O5BnJl8WJ3l4VptC0ItNMqgWsoFqDMdIugrtSz9axQOjdks10XM9/WA6CKphcKpLknKnivIwB+4rgYEWK9fmbEM9yvj2JxNOpz8APDuW8wjedxJIy2ESmUNTBrRUG+5aHbCasFUuaqHtJZZdJaBTYU3Ty0lu4WyEY3B9lLvTT9d9EtXKWDYoGsLMW277EtQFS9CtI8okMSxDl/FIhCsFeqorr/1M02s3qAZ7swv2DV4c3A7qnKQJKNSs+JckmKjKYUpwFuzZXbjmHrKKoPXbG/oeVsYR00oNLWZyqOwWqQva1iOdyTlMQhGeFIY3f3dxLmg7fz8ebzpxvyffiGrtZBFI/SEtP+dAqT6NHbElNMPbbJ2mVOix1TRn3P3RiOUXYP12S7pqpizLbsGxZ/Z757Y3R8yPMgfNhoNyhteb0+Cd6USqmyjgMgnRbwckIY1+3aygHhVXsJAIM3JhpY1y3VefxI1vSLwXxiLbVQAMl1oZ7QBsKVPNbaEHs9i2EH7Ap97q1drGYdTy3baPwVPzcVHG73uVp+L8wKU2h5Ea0Jpcd8pD+KD0YS57SXI5hWvyS7eBmkT+ebO7Jc9vfFg7fFA2wEnbWx4tauV9idRBrWtRbRLg6Qs1c1fPYKwvJidh5fktgqYAOYSfitY7WiOO0emzovZhixG8iLJMlH8Kj+GMTL9Qjt1NN1JCeHsrEz0lynDd5mN92unBpQHcsmQk3mYQvicu6JtIl1p56q1dzNPTB+jPLq0hyvCvlafs23+kzPrNqa5p0Pz6uXGEVl8Diiu6O/gtm4r+NZeGuqy7mz46qoPu7Ieq6bK3EY8L3V1dP0FAY391JTp59ZaBolZ+tQj+zFWBdzNxK1guo82DCiw0DPZaDNF2Lddn4adIdBn8mgiw6DeNtHrPdihnNWblqfklXyLTW9q/Z0phaEv69SdrB2mqyTETaeD2Qzzq5zrzZTgnfwEM7Esi2J8DvupHMqX18XddNU2TNNU75t8BsXytM9eprkJMw9PJ7fpzl0RdJNlDHJWRDNNBJAYPd2DYhySqGD63VWISF1mENixcNM8jSTvhYeNqPco3V6O/UxyC4o28qoEi90tiOnOg9vmO4tmLJmmmBdT5ZML3B6aCkryYanOPjNZIu15zYSRrRn2uv5biD5B1Auq5FY78UMJ3YDeZaEvz8F6bKyuL28DbfdwNF5Fgdrey8tj4eKdeYTeSTrfoj2aqnhem28AhDF/has1qpwO7SizRFVXNchSRaHeWUp286IB5lY+mvJxgxIC6sdhRrExvoGrt9CCoqI8yoKYHkxOnfuS2gtKC7LZ1vnxQwjdulckDAlwz8PGGVvWQ3qCAehd2T4g+RaaDu5HCgu18ttEsU+xnmqWD0WC3BET6gPu/yBTa5Q507iyKLLjC7fX/+I29W036nDGXkc46KD/lyO0k59KVq7PfRk935ZyoqsGQ3mdqG7NdVsrTVUBcV2w9VyPsFRBhrbV1NNsK/6Cqa+Gmq59lVU7th+6mqBfYSBTf3T1OgSp4VZZ+a+1FAg7WWhidYKouduwTBH3DcNWmQvxuic+97BqCjcz1q1yA4DPpcB12lM58GGER0Gei4DDUT6ch5jBcdheGcyvOxJZBDFpcWAPfXhKu3ZQM73+v5qHcQ96fSwhTvdpSk1tT6EefRIBcXthv8L+d6x5imbNGwGBauDt53yZLmYavZtGzcrb3XV2j2BHVrZJCCquO5oKnljwv+FDqC9XzK8pkMimLknEqxrF5jUXye7nKA6IEHD5AtARuJFSOdzgXUAB4TlmyiBYEJZmZG+AqD3Qx9QlLs88gEQ7dkC9nwtkXoCOvkSNnX2bBg7re/XSdKoKbf1lW6oORXnVre9AR/htuFruiT8++UXcBB9+hCtl2xYNM6BjYjfiqMo+NjpgFRfYC2kqztDKxc2unlIkOYWQPUKBKE6HIDbrIyefDbQrRkRLO38rLdRLsKCdPMgJqoFuH5BiaotgVNIoqaO3xft3CJjudYN06ct1R/QzuSXKA7SJ9zKOKt9zxiX6/XI1fZVzzWPnf0nafX6pxhYt9WrIEe94CxjHcllPdzuxE7DoZUamb5V4bkYS3owNdiSAdZVz6ictvYCqAH3QwE09kSF9qJ/mtguHfRQW/clGJqjHHiN5OsTrIaPxzmWe9SYvjhfCFlm4s1rX/cZeTJ5OK/05S1+SilZJemTuj5QettCV+r4x1g8xrLANcRTFF8FMfktWuYP/Xr7G7lbkPQxConCt2e0sQLFDbVCt9peWVa156mudbUrIBqB81lrKcaRZqMJtM/XMPa0BcR0i4Pu6t2D7QHkR28Aw1Bv9Kc30d7OOiz1fA0j/S0gpgccdN83AcbJ0eF1gAHfnhlez/egVl4WHd9/g9X3bHC7bWWljntC52mjvZdLe2uZGRSqIGi3alVVs5praFWspZrzhtzlUKHnqq3E1Eet8V7URx/d8TIUh0XZ//j6tYf93mVIBTBodxYvx/0CLbmt3eQis3ytPZPWZxKg7CDadqWsnLk6qWWg9p6JercLebKMUhLm364/DS5bC7JiSRVu0iD8nbZw/kh/jDJ7pIar0miEpGHn37eUvdmHXJZ9e0WmhYI1xm/BF6lCi6MMTN3mGZ2iUTxiJ8sGR+1jeRJQXjEN3GTxrtaUIcZznJOegf9V3Qsdq1twLJcRq07lN6f9vdvlI8zuy+wzlaK+dwqzW3LdrlgRZ9LA2gpckerPpTvUV3e4XZD4PduFKABPd02AuI51PuE1vM8EG1JfahrAcLR7e71pFK9OTzgNGPfMWHy+Z7vMP8rVAXcqHy1PfHKOATHeHTzjhI9L8mD4fEC/Rll0F62LLb80lnxR32t5b+Qb30TYV+VS7m8BYNHpEoIBvS5BwJ6hL1Xi3F9iyzgOmnommnqxu9s6Kuumyl7ra+sbyDSnqGlfy4dLLtsLh1ezm80urtyiiuRBq10alAH3XJ7R6rG8mHmGPSkWmMU7VqF2uIfc3JrXpRJTLQ9M9fJ6a0DFvx3sggF4YdgJTd93iNoOdniKqMF1mPYzWmIv44zWDl3VulDtMKBTWAHD7Rvmru3x9iOfmh1vQnK1DqKtPF6NVuzccCRDl43ESC819lXI60vLMraUU2BjqeYMhB0Eu6BSEK3iG8arUhj8zxDL+3CFgt43Z67nW9VYue8KhEF+vi8hxH6aY2JKcn+rq8tFl8RVUWNOIus53yNx4tCtr7rtC6oCvp8eNye6UXKPxgcimoH2O5z6CQPdcwMKoTkM8kwGmd3hflhRm/Myvk9cjBap4osZUKyBfk3+sSMZOx4ew2PvjDCn34tgE62H34iWjV1mi220JE1u3K5eNV8XI5H9dfE5+PsIuXxpO1E8SjtUKMPhPY2rdsbpVKFSRhKIoq1xZKJsajwOjiMZI7kv7tX+h/EE3AFIC+ZtCdga/FC5Yt+DQL3M+Y8RXe/Tp8ucbFyWf6HaYfGXVWaRH3cEN+mL9K01N4+vRDHRJkifRjvtXpAwiZdjtniabLbUWveSXwn3nHZ4S41OyzHcILgTrcPJsKJiL4LQ6dV6Ce/XcUZU8wi2LH95GmJp17sH1K3CuTYLltxyQFyGTalMWTQVgF4L5mUcRmwZcLumretMNqpUfycpp3MwB/Aukf1DsnViSVPlYDxMcWtdHU8855hM55sggh94NLJ3W8EIEcf5IijguFDeS5V8SlYuU6YAP0wXqa3PJMvGCGk6zvU3n0P8YEopM+b8+5ZurMjymmTUVs+c/EnUuoe5JG9MsiwJI1a13MHyt9zD7YakRvu+Uh3pVMpHRt/ZTUTTeoq40Ven2K3+Lt8KrCy+9hpdXlFieyIf2GlAMFT3P7a7lbH2vo03I3wxqnLuF7ZNCsPdXfM40MnZDKz/YoYXuxL6CvbLs/mlpb1W+o7KkCwK5q0BiZp0GFtXm5MYjcBrwAFN61DIAQsotmNDhB3QNKVPEQ0CYnvgJfiAQbic108trhejW+e+dDaJVoQIEeUdCXoTqcWxZ8PcKQjZAPdJeMMnwByWfcuL1/+vCug9G5LhrRpKy/DRGYL1boSDsrkZQvjbwGhNykwhSFH+70kUn66DLGNXg1Xlg2TL9lWw6v24hL00S/pimZ1gmqw51mX4vrWSs9sSgrts5QvUm1ah1NlGZrFjTMQUAAAt9H96UlhhLyvR9d3i4cUiLMbrZLes8s99S4e/5KhfSLLhGOXu5iwJf38K0mUdCdR0BP3SF8ErKgRn5D6KI9fzK7nmYZ7JWjTK1z6E3T3wV1a3NnbbVJ14a9rSSz8XYnOOA0fn1yjqkoVMao5PRhq+PVKYuw2nLpXsoZfZxZpOuAYn7rRKQtPTF+1bvCTp+ql62VerNpFbn8nmjqSNGAclAYz7xTbx/fFrhcFClQ9KhTcqA0tW2dgn5GHB8+8iffvqMr5PgzLQCmXLK4WlHOofqH36VoL/cn4zHpM/J3RlTNJMxzAZ/pqEJHokXAXVC0yoQCdASLKMb+Inc42LJP0jYMnW2xr/Zq6xSNa7UttV8H/qMeqlzvY+4gx48tGmNDEnee30kOE/JckWO9DKIPzUYRDkoJzehkFEvHcDQREWweZ1gwEzt3aVoT1qnGe2X0jOLkPYtjcrkqnTvxKp5/HyqArkDMO32+fWuVgBpQsyZV60peyiLKe6+9UrtZf2ppr8T3JTmmb+ReYMxwUzc2qTmSEuLoz0fFFBIZbwUDKZb0TcFPvX+IysSU6OPhQBulioqCwMlqpNQcd66UAYwMAaqua2hYe0BbqhISmrFKxPExZFLIjiXN39RHEYbYO1lUtSTeTOifW9aUMuOSNbErMGrZzANM5qwQQ07UiDYuNQB0Es/H5O10G0sUsiB2sSxdIraVRR5CmzyGIBNbAwAowaURoBZmBar1/tTS+On5JVFCPFsYSdozhWlFnEsYAaQxxFRo0tjiIz9ksczeaLCjpHYdTaOSMv0yqXxpZEgROzF8QPeR6ED5vioV71NEhr3CqgoAnNQdnH2ogdkKaiQEXsVcI7yZ+e/BHkTz8ymMaLCuzqZhIBrEa0JFvy6NbJiqEOJJIaoTFJo6kFQCxB6jFbx06yhiBuBKFDDAJa+uqHJdNKYPxI1pQ8/VKsQDpI20CLsEoSpDWrQswc6CeRMmPGlEOZA/uj+64J7WlEcdpFrwV1kD3LqRWAGxCipnRwKVL7OKIYqUyYvxxdxo9R3iZoiO+jdNPceSHWU2R9cN/BVXVZYLFNQoutoYezswsd+znGZsVtsDEUqVjmMBHaH0x43CYBXHewCaBpDhJ+Ta8GMzYd6BxbeM2DhKJGwDCR0HILa2lMX7EcW4wdcY6SXCwCSHydVvUOTWo3S7pODibIriSPIM2uA4e2RCQ8U5q3VWIwBysXqqE1dhvgLjYv2NJ0pq+p42NZwCaWoMWvQjLtvqrtyYJiLT6hBa+t4S54Q270QQrxx6TDCKvKrPGFVWUHhgb2rmIyIb1I31Zu87X2r3Mo6kRAWwMSUh7YZWXXN6KTs3FmQidJtXZmBEm1jtreqNWv6SqI6+e/X2/bjulFVl8FklkR2nFFNzQFSK7b9OgkfPa+jyB9dq5giOCxTHZVecWiImTMtXFB2Fxqf+vlz1AHEkAJ3EVvmlqCNkFtuWn7090RUKEnTe7Zw0Y0/SX80FyqWgE4VBUh9UCnGWqhZoTpaeE6hoKqymTTUljfbFIGAQ9mvUwrXCZSxjY79lCspNg3tC/U9ClihVrPw+xVIZGTo4vhhQ7RHrQCQF2anQWN79sIMo0fWAwxXPWJZLyO88T6sssfGFIg/7lO7FC1IUlvK7pIOa45UND1fZudvDv1cgSRdxpklNQrWKYX/ua4WgkkhhF+fe1BhN/QHGjn6/s2Z+G393Jc4bcPMsqoUbBML/xNsD+cr4a15iBCr2kKEnhNf+Ys7ObejSvo5kHF0CJimF7Aq2iYCCmTw2F6FGApdiZyq+lvN6glZVzpEjmMaXvS1wm66LDInZgaInaA7Z4SVxYlttPrP0s3xt/OyaPlouvmcfrFdwh5jSdUcT0Js9yIGBoCZNV1QvQ/FAP7PvbRGMgXDBFy7LNZSCDT1rgNlLnaYGeyakuQDal2Y3bqE9ersaVZO5AYQqbcENH6Oa1dWCfNv3GSbK8KSTNXy0WYEY1pXNahLs1OqvHdG0Gy8QM7d+lmkXu+JEsi3MDrr2IhaPAitgF0uoMF0U+2MzKSM4KUGbmNab+tNZ1rRNuHq4DhrD9gZEysMYicSU1AF7LaJgaRNJigcaUN5jvyGJOrOQepu04SJ5nj4QeROKGB6eUNImdcaYM4jqGArzddlIo6AGG17heXv+InnK3oigiMcKHgcIpz4UoB7Dpg6vzsrMqufR5hhnQVCAxpIKKJZ1AdtLV0N1OixNqk1lzdNFuEml0mjKVpKMSiBDPHU1i33o04IXAj7TIN6rpzWkUqmiJT+FBTrW7rw0BPhMyUIiYIcm76WgNUNk6j8FUmddHucxJr60WZoc4oJk/XS7OhRHGC2y/EEGComPwGDOjHb+RuQdLHSO6CWSbaWqOIINccIIRt6ZA7RBRZ08iiOhoYOtpak8sjYMlbpRGoY5LFbjIINWJYnEcyI3rJr6FLI0qvYfT2a0Hn86wWIfor71/xI/LEowMyUOYBPE7S34UOnTe5iRHDKesePRhjFvQYaNT0gFHNaY7YzV5TrdGkflrjF0PRVOLaywCe6lk82BOL06uhzmhiOLVLLIKoqeSwo5vsZBLIGUBKd1BGr1JrGLNXbQYyfBHC7n8LZiRvZCNWOxrd1ulJL4jZRTf9gzNWdRV0V8Tu18MgdvDdlkL07HZftv6MILW2AcOQ0FSeg+vhLkW5zxjqDOVsKLUykU8DgqQRxA7BfgwVVdVa9U6mJ/nufCHf8+tklxO0/Ak1BpI+sY0ZyB5I0MiSBzIeQwOrOCuhY6OHkjUGOJCIFag1kjXHs08d7SMLIT8i2NV2QpnbbHZxFXugiBq+2qV1bDKhEBUBoxs6WH71mNwEuhNF8JMBHTsGVLB9qB9F8PsMOMokkJFM9X46DcLfo3hVPuJmJyLCB3uYAFx98K21VNXpxTWyWTBwANzD4Z5ku9E6gng7DhrqdFTAMDdhxsU5wtQeTZCtehvs2/hCPFW8IpfBchHgCXUxO9v9sKK4LuP7pDod1korBAwJpwTnIptgE5Md45uoGUHgTPye/cH9RRAy79rTlNBZsfxF738tA4LvswsYp5fZMtbJhEhHyQgCpGMtylqsK00mQbR+SLb25K0SnGYPX4I47uAFvPhkBF7PhSAaxtmIQ1zFtHxN/rEj2XRPRs+/b0lIZfeaZFuKirn8YbOv2mqCOTOUSk7pWK1NgnmGpFpzj0iG7uUIko0eZAwt06Z3VXtiNOA08KMI9bSWnIWgaaRur+y5JvSeGNmK/+kW3hSLyBQzr3ukM2cqIC2s7/zsFHDX/o6xr+4oECj1LCOZ1+yxenVa6o06N/Y1GiCyO9NJ+l6+jdL0BRkRFaw1qjT7chF1ORKJ1uQmWGW3F8Y8IjwUeBhSATgdhwhIoU6DKUOmn7wg4WMcnUCjgGm3YGQyXcjEmm76P7uI0f95lzCGE1ohgtWs5Ysje0zx4kYApfaD1UiidU7r5E+NO4YUGfTsjpWQ73SMw12WJ5sgjpMy3fTPVLOerlM29Nn74zzdqaqOYV6QvAnDsyZU1MrPnMRcsu7QT6wcEDwRSQ3M1LoNYQ1jRcoAbYicKDtdB9HGhrEAckL7KVlFsQ1tAWRFK6a9BNkoZ8a0YOQyDIPohAzEGOpMZCFwlOeZ8oGZgg4Gs9EXP5I1nbM6EptiO5WFC0i6adI5mIk1QdtagnPNQ63oIFEc12ZF17BeC29pTUwLCY6DnIzTgrHJqAYi4/Kt2fCIGfFgbHICQhtvdckWVa7qIC0tiHYzSLRsnNtoBtODqQSDYBbc7UYUpJTfp1qpNOR2Aog1QFvH0JBIBxhHA7StJV0GE7UVHaStBSC+tYocALLg5fxCwYEVvHQRuhUMWQzqVRDSNtMbl3F4knMe5RZMaqgEECMUUcE+C42R9qD5aKyA7IkQkcnYGSl2kyN+JHIEZj5gCohTjKhioxN4AwhTCj4WxGgtYwwBWHUZq1j1l/qgDFBbKpB1zutdYjVKwOTqbNcKWq9kSDFogW2GO9uF7UJDNwQI+/qcJylZXugNFB7Avn5KTm7wKqp4H1rXHY0DLLDuaCCxLdgGDoZDbAQ5TyyQKYrXmwXnx4jum9Ony5xsNBgFCMwKWTps6NbH2gPGgofuEzU4ihL7Hki56IT3QsAFs3UfYfF6AHYSlhpIaxJhA+sOqm19Mtwhqt0xAFt3pmH6tKWcEJT9WZAH8EZVB21nWaATn+oE0FK/PXtUELRFCBwaIpBq8CpYkTNyH8WRYchlIAUrd7TGrf/Z9gvJm3OqMxa/ujiv4qBrC0ADKp/+cREJ4BrNIW/TT/DETDlWtCOuT3o5xCAy4ZyRgiEYxZ//3VZHcSqPACh9L1RgiDN2bgB4AEZYOdyDKYXvSH2cqOcKD2bvDgcN8aUaAwRfeEQWxtR98MuZ+kTUwpkKDNmhEtoDZypEFs7UffDLGa2yAaCQ3dGqGEe2aDXKEBPpQ54H4cOGxK2DMaSBVSiDjlSAIabI9rpJ6aoIAe5wh+K9uVLhgg+/VfaYwPXdMtSCGKbtHxopwDTU8X4P/lUn/eBMU4EQ3aphPXCoQQUJk3CD4Y0fzSWPkSEclL0bLXB/lnC4IINGvMHqr4+ba5Tiaa/+5gZQ0siqBo2Lw9Cdp9gGoEnpcI3Vk+26qywLyzXVkNyAa3titQY5xGbkPZ47i7mZYrnEU/mMrqvnBxYFaPSbJnm3VrTLDvZqs6O+be7mMWoXBLZoTKiOVooFZwKbLgYxj6CSpcYXFHPxCcM3Dhjdu7aOb75xmAe2FYXsrDwVEM/0wPqeaet022vo0ekYZRiCDvwSvQ64jIwgwwzQ+i7qK0EsUz0lDNwzoAbYB45GB55J7hCcDwPINBO4vmuGWhDbADcOA99MyKEFAuml4YGVpd8Kio0VqEMvyxoDsK9CDLBOcNPxq90MvALhkErIwCVHdTYaWyQvetBFR2USopa+o/bK4DGLcmVj4CWiCWiuYhyU3Fnc+igZnYpULuMq6rmAqg/xWnS6MvAZ1wLIarx7VS+Om5yrjBw3VETxQ1/fF8cNLYALEd7NrBfHdY5mRm5rKqH4ANf1xWUNdojDSBe7Xtyt3mOZuQk92tL1T3qq1ZNb0iusASxI3YtL+yoFP840rRvKs0xP65Hy8hLJ9b5mD0+GfVcnQiMNF6GSB0NIxAfwyzYOfXkGuLZa+KbWQPZVqeiBfypOSHPZ/XfduSgEvta43aqcRNTS99xeGeKo5Ips4CwCv+YUHON03GEL2OZMbwcd3ACCgIZdGgQPbv4Ex2jTvg/EOORJQ9sgtXwIFyjfzB8JGNUjsY4vPklYoa2gAWs/ll0nCZZhAiiqY3wNX8wScA7PKtdc7KAvgisOg2NBx9TwPIfglwkmbwbXRuEtt8sbhO4DZUkmbxgelzT0IH+QieiBoVCeViBGA5l73tDacFOES2GOmw+6nOc2OQSynnuWdCBbufsA+uGqaQuETrht669pK+SDnyNuicxZoHFM1KWNtnUTSBztmZFArmiuBfnpkzdmAsrfxEoI3N5NoFYv+wGT5thxeLqwsEsOXYi3vXPxiszpk42X55rmfZxpXPok4JVPmV1ewnkaPKNGxmeDtfPEqJU98X1MzWxIT4plpfXsE5PPdAA2Dn8yak6taVHGllycWrWpz8bZVyHrE3A6j07HvfAZlA9SsxkGYc07V6hK7+0wiBS8DrI+3+155CelJ7Sd9ZmyGeoP4TT5DPuf7mlSGA53oqBPrGfhnCELn7Z7cB6+3lyDU++NwzOG2saqKyV3nLYrV3z2uN6MueITxg3Jj045y0Cu9c9+JnGjV/4zYQTMUQSMQ9Ir5Zl4po+NF9DhuheZUAu6BO6Si0u8zHXMxsVbg0CsAdO1sWMCLuGqHRdVwCPvrc467omjcNywOut44rpV5FGRFtw5DqYsAhhsT20k9NOY3EiyvqVQEAbuGfMZDWDTK1l3oMtnY2Ye8WpYl5uHI12JY2G6atZl5RmAFXL6GHit12eYkRdnMMeMuNK38TfM6zyYVmaoF53WZCjQCwe3DCpC//A5VPgeg0FDTK8e0GlThNc3buFAvHBbp59QyTtsfdZpKR/8HFpXOWeUMDixdctKAXqlOeelAM63nJy9Oqei4CUbHxnG20CZTi2d8h1guGE6ufTJ9RFPL80R9PFMRXtvmoPuD8TQ4c8xxbD6kMGjj7svWidg5H2OYl0AIgMWoN+60A99us6ivZt6rkSDh0nm48F37jcfAJ4XqjowFLrXLMY7q96cjDRl704W4QPZBNWHdyeVUbUL1p+TJVlndcHnYLulW5CsrVl9OVpsg5BZY/+6OD76vlnH2fvjhzzf/nxykhWos1ebKEyTLLnPX4XJ5iRYJic/vn79l5M3b042JY6TUHAzeCdR27REzeNgRaRSZgguyUWUZjmLq3UXZJTnp8uNAqaGXBf517C4bo+Pqq4OFwNmO7Iamv27eh+fsX9/vf8nRs8rumFJgzIO4S4lQpilfwZC1VfoLmhPWbySotOEG30hmLtSnSJYhME6SOuI91yU/dNkvdvE+qj7+trs/2L98ouK4d2JRL/MtxOFcS6chRhaBtQqRklV3jNl6CdK/7ftku3dRDRCAR5fuQ88K6wUHh3/HcRGZ8KyCLp29Guw3pE6PFnNTQHZWcSWI7Y0UQ7OZPDNgzf12CvcFTMxjMrcurzVbyjtp0aM8q4Ja9R9tGGTiQI9iEUOQGkg62/4icfalLHU32YxQZRwg8+eyfuqc/kx2hu9qxeJ5ydVWm3epsHZB42uC+3pQYv31eBjmV/VOTaPoPrkiKMKsyVrFLkMj/UqyLI/knT5McgeRJxiCR7jgoS7lDE7DzZbEaVU5EDlQxKTL7vNHTuQFYjkCzrh03AUhsC3cPNHwq5MkvQ8Du7WMna11GFZobvKZJfT7TtT+d/yUFpc1OIOuAGa5TI81jLYwgUVUbI8LR+u8YiBYjxuNovV3WL7dRaLl5CX0l1jgQpUz5J+qqo411A5yn12s4BUVO1Xh+lEsrx59SjMJL7AQSQfqbgxQZZEsf3sqJirgFMsybeimLkyBxVVBn+RB5P77GA5rgMW20swGstPDmo9VwxPTVpmPQ4+EpXcMblsBLt4FKv9JtqQ/6RriSwZ/PfZmGpAeO9B7LYCd1/jrcy2OJJa9LMFKEhmPFImY/3ZEVexMQCQVd9nsfq1u82CtN4nAqOO+z5s4mu27tUmXjOKs5AE48a7SvK6DztvICeBzyEs89L2G0INDv0GhYLTb4/RUt4KSkVOllZR52/kSbG12oKhloqJREOJktpXMKTcwu5SYUMw9U2jditRh84VNhL1x31baSYSRzEqdF9Z5BNTuwuisfaA54Pg3tFt0zjMVhSKfA7gViAOso9Xxc5yb9xrVSi77LDqZOwjSf5nKo3BStkdc58dLljIPUlJHBJJGfPfHQ48dnd/J6F03NR8xOP5ePP50w1z/hEQtV8dDBVqecYqKu4zHhebA1TRkehRnnJiiaOWKN2yAeVQFzgcRKbJRhaL+psbFuA0s/nqIl3b9dNNoiITCpzxgeaDXPbSNGmXjQmXUaXLnqSpPtpJu5jLRcIklTkMmJKIRxo4oHw2S6GUYa33yROXha2DTLTVR5MJVRI6jH9OKZY1J/cZj+uXZBcvg/TpfHNHlktZo6ilwxm8AysUozHFC2UXi0rI4j2SHH1NoxVz6VdXK7HE5f6H9ULFx39/actURy2HTLropuswSBHCikMz9VnMVDs1PsVi7wOzBlmXXZqh8jCDc5EkuXzkWn9z2AwF8XIto2k+uvgDlKKpioxY4o7xjDRvoGDEAsD4RzyfSbpiCi1Y5CmVEHnbXBUedDFWFzul4nRUyXjcGM3sgu2FKmh8lk/HkcThxYwiFtNLHUHHBKJdjCQkdrS1hMb3QsdUyVbYdxhFhB3GzYZg6oEyXH8n31LJk7z56LCxD8LfVynbv1NEiWSOKYUORtQD2UA2Wfv5YJagpgyf+q/vbGlwdZgohrpznSP0Z14ERFGcOerPBxnEyaCS7rO3JIoYu8ijDcNcpfJrcW+oHu/y36dxDv8YZBe79bp8hSFvzIWiw7zBmbCtkPo1XnF4MWYrFtPUs2mqayg5ek7foRMRdrlDsCAYZqDqACbVAxsZGVDsct5WBh2SkfLfXZ+YFfl8ocdlVcFBgeEUGC7Ls6P2QiDFqC4Umheqt4QwZ30HrEXWYZhMlYcZnAUJUyJ7a1XfxjT0fiVpptwdNB9dNNCdrMuqT+46FvIDkcscbjLi5TaJ5IeY7dexH1Vpb2w63tSoCculJQUod/D6yS7St1//iNsYjILMK6UufHhUzobqb05bi6WCpvnogEdJQi6hBMoP6zNyfVYk0OMyjcaNWq0dsL3QRftWnQket4xo3KhtowO2lzqa4rrqbyRxeDGjiMX0UkcQk9XdcfCsKDHjhkDyQodMTNXTd7Q4bB2GyVh76vHRGmvrQAnIUX9zcRHtHyKkSsdVp4eTiQKKHfhEvmsRy2UupmPAklkXkYJl45EvORi3OPXbTCDPOhiHF6OIsZimnu1T3Rvyqc5chs3ohd9i7eKD39Yea5iuk6RJKqhGfRTLnHbVJNbiVUtdHsq91RzziyUubxCWRHVRbb++NIXYQWm1WVK7PF8KR33Odh6H6dOWjoR+QdSATLvW9j9mlbOFy3yEyt2OI8XEtwp+EMKRft05nVI4i4lRJsDtuBCMNiX6G+a+z7abXMCqre9sqheZS4QrhcBJq/8aZdFdtKYjI12WcN8dVAOlfpWkEq726yzEdrG723aVXFp3z4SXSlSa0y5VlCs7Q7FwNvarrK79PEVWkHZc0W1I5ioMXu4zi0xGkspxurv0dTvrWy9/IWSZiZcl8vkEANDdRNEt9CrIVB497vpcS1fvN/Wfo/gqiMlv0TKXgqSLJXiMv5G7BUkfo1AxFsWSl7ZH6u6xBAivT98lB/Soe1E3hFMr9YlX4nrW+/JDB/H2WI8teIYZPblx3a6TL5/LnvZFKyt5YAYRaS/yvE/25WWY0KVYXp/brwfhRAlna354EUseXQeBNFc/iOKzFkX1WNOPpgTQdtGVKDQD3S2RZZSSMP92/Um6WOILXHyniz7epEH4O+3z+SP9oU4DPVTnlqrSSI7YaQBzuJD4vqXMyD7IjsrtZxdcOUnpHlZzRQYUd8atMh4EcMd/lmyCSLk8UEu7YtYTzpe7Yy/3RmyGwdj5ckffcykcT/2tw5mHhIn/3ueqBzqn0QE5tLMs0xtQkcrzNLrb5fIEhCFcvNw/0xGXfdvLb4flD3mmAQ+0X1dvhwZQ5xquKKe24SZz+q5v3Dz6ettQYgYQgeSFDtlpstns4ursvYjFtdql/mLamNB3ckN1QTfMkAo0qKfwQLHDwgsHzn7BMbO7+1tKw+DT5RKJGqOZHJC9UA11GZe896WSBHydYqob6089SsPfPL5oxVJv3stnRn6epEsouzxMt6IYRiwvKBnRKr5hyWVVEVVLHVbCqkfANbdQ4o4RfDYulR0mA26VFfnm8VkgCi9mfcVimlptTz2Cfk0kDFaX0TsYRsDYsXO9DyvaHOV+4mUlkjB2GDErhqGuDv6xIxlzvAQuD4Qip8ATUUgugk20lowmscQV42W22Kp5PuUyhwcpC4jG9qsLps/B3+W4qc1HJzxRDOApP7rguQry8EHGU310xgMSxZc4HDUzEYfYLhQ44gOYz393xab2lv/uiA0YCP772BcUL9rq+hhlOfN8ysnG72NEAXGX94gCgtGSAhWxRmUc7Venx4JQ7Cbus8OTlDTaBOkTvOtWCl2umsOkyE8FYwaKnU42t0lM5BhY3Gd3TzvYv85p1SwSfwhrpWMqEGjH91J3eh2swosg7OZIOok6KNm3/OVJyRXHF4D4TunUKe6Hj34N1js288uei8IXsacQ7Bo8h9fRSbJEhhHLPr8/o0Q1YJIq6qH9ihsfrt+zHyMLmycfJoW5YoPj8rd7xJyQbP140ze4ukXL0dWd+qzCsoNWYjq0n1/aStlRBj8lKy/yV+DpIHuaesPIXZXQXHo9Vn8c9SGmGiT7EB7bRW7Pv2+LRCLXJKPWfuYpG6SCtEtWSASSYcT7Q5YlYcSGXZfoAobo3oJstELlYx+2HLZParlz/jdJhr2nyXXCj7l6ccU4tWEzcXB678k1YMQ9gtZPk2zD7/N5vg9QXEa1+KCgcApKYZ0/3YRGjVFLDsheqEZqwpEJXutsZHxk99bh7mLXOSAbZizxR8tTrS6Bn81kgafL2gHXG2Y0/kak48DiA75+cW4lYqg+HRYBlLRdRGtShB7qfWOgQYSQOH3VgeyTYKWYJuUnh3tDlks0Ua4Nm68H8UOLnxdtd9E1L6yu4kA3Vetkt6yCeyq5aZRChwvxNFox05r1RrVW1FKH9VJKjScdLQDFB9FHif4VHeUzch/Fkbf9o4yyS1RRK4qBdHKUr2Wn7/KTk17PFrkaqNk1tB6dexAaxynZP1ib95CpdGxV5dB+dcC0DuJ6EwayXAC4XB5ODZXi+pS3TAAtqoYP2fYLydmp7XWyJtnZ19vi77EtHoiumvKciV2g0x+sGFA6S+XAGsR7u0h2aQjt6PUH03LsLQWz3utKc4eZqMmjYXohrGyQmt52Z8RNkK5IjmUERlEaCWuv7S+zL7v1+v3xfbDOlFsKLGu74oOZ+u4ElGy88F+JidG5DM/WCWCsaknAjs91LUuFoVXHKaJkQeAxe5BfE6X9ZBhmnhvJvSUHPvUu5J55s3Q5e28qdzthB8bA2E7PUaiQeJAUM5X9pHoYfaftu12s6qW6yYYjgzS2QPWl+Z3VH6pd2+dkSdZZW28RPpBNUPAh2wYhMzooxEWUZjmTwbsgIyXI8RHt/CN7BvL+ePGU5WTzqhDSxT/Wp+uo8MOtAT4HcXRPsryISfL++MfXb348PvqwjoKMuQKv74+Pvm/WcfZzuMvyZBPEcZIXXX9//JDn259PTrKixezVJgrTJEvu81dhsjkJlskJxfXTyZs3J2S5OZGrV2hRWF7/pcaSZcs1LyfclqaRDp0t8u5vRBGFWkSuyf2RTprencgV3wESyUh4fxw/Bmn4EKTHR5+D759IvMof3h+/+fHt8RETNPaItRG2EyPK0oKWkcpM/PkyXpLv74//V1Hr5yPWafav4vMPVLy/xdE/drTgJt2Ro/8tUPXjn/7sTJVgMZfEsR95tCHJ/X1GCrEiYZQV8vHfePxUMVrR8xa0f+ySx6HnAdPbR66DePk/bnXIgILSavrhqMge9PPRa2mUpa5g+KS3zEbtyRvXnvA7KJSKqBvvoia0xq8KqrNrbVqlh/yUVbFCgZLvHjLgJqIHReTCmk5Cv8fr4vkmiNZGrNK6hhmQAmkRCirdtAJ1F+XO5F0FWfZHki4/BtmDTOU/bYLv/+xK2oKEO/acYZEHm60XjFcPSUy+7DZ3RJG9vvi8sPDmj4S9mUnS85jV6oXrUxL+nuxyuhdgc/lbHsrT2bWzDcLepH0IQ5JlF1TwyPKUXXXUyKLYHRmb1N0sxrqmH4uxkzY6XQfRZnyVVPC52Ib/ldA9GltKroKcBU5tyes0EPNZswvOlrcEHiZ6ga3yhvCA7rCE95k0n5JVFHeZNEXFeu+Psl9rYNCVBm0a26emRJlnw0HohWfcU856tPQURk4VA1I+WdxbfQstep20URMcs8MY8py9rf6229h5HcPg1o3OurOPgF5TlNsIeIK8t9JZCAZzYeHawMrT5ZmoFDrsaCpR7EhAU7s3HVcsnyUd2yDOeWPEiRoJRx+anufsKbj0bGZO9f6zFd1eyp12laQkDomi37vtyXfFOzovuD7efP50Q777QXZFLfTYGzYmwVQnk+hxoIlSiGz9CrCDTiir9lEFF2mycVePZS1du6iuMxTebJdrsl0/3SS+8WlMorE3ezPWuYXWW0Iev3ureGvXXm/CVPLIG7rnKUi8PoM9hUYTqHE2YHizJn4ka9ris5lgF0mSezp5/xjEy7UnXLXUeZuoTSZ23rfYA95h9lRIozRdkfJ130GTaebrbXUHFNSPaw8KTWLQZfwY5ZZUHS+WOdBe/8AinkVf01UQ1++cn8ui6M88TFZJ8a7GA65fgvD3VZrs4uVpslZvebqtig9k42+NfZ5LCCXifqIt1a44py/iQUb3ETOtphJk+jMvYuf0cn94nvIhvjp4yVLCBwzzI3Rs5pl6ijC1Gyx9TuY+BtkFrVB6yRzmgGIoXSFeF71UE8n0hmZvTST5YXw3dwMFi0/HcT4el9vuvK3Za4NeaosqZqcbBVzVXiQ8U3XDseega3jO1JL7bPTMgoQp8XOB6M3M+ZWkma/zw0/BHfGzP2zeNHa6wRRr99I55/Fym0SxfdDm5cyGuoP2fHrMwsSxicGnVnZcKBQMvcbuMrtI3379I67FoY+pe0YefZ190J9Lb7jq4zwupKYbz1UMhzUaWKMVyTws1eKeSRGjA4MEBolr0oE5AnPY4nYQGoUvTZCDl30SxwJU9T03K1D0Wtk6ra79F9TTXZrSrtaZ2XryQcHW5xzxC/nuiy4RVR+iTtlerQrxcbgI0qqW20a3HPSuegtCtcWXZLmf12TXSZLXHeg5K0VUfWYlNQ9py57IkpH181J+2+/Ul0fgc3deYCpiNXafJ89TddXrROMFt4+z1KOfgrcztyL06syOFH0fUn0hZJmJu/k+x0KyLHYyEkEkvYzGyW+L2vTG3bWXcoLo6lIaxVdBTH6LlvlDHzy/kbsFSR+jkLizk697eFcHXH0Bkn+wRaHVrp5R++qXI/ejpw2oout5uy0KoifqWnSHQ3WrZO+lWEPTX4xB8Pq1q7K/DBO6cuV+glw9T9lp19Vn4xzgbUdwEB+76uEzmhXBefdS+VyTZUS5k3+7/uTnPSkpsifcpEH4exSvzh/pD29iKSGvSiNPcQPOv28pK7IPuSxG7ojYPA7W2lOhjuQJWL0xtcZ7Rg2SKPZMbInUO62lkc8mnRe0dcLkrj41Z4O4aTo/omxr9jNkFc3W7UgCRtNnC/thWQaGp5Mgz9Pobpd7mvqX2Wcqpgc/dtBpBRjEw/5a9FxZBwe+QL4Hmw01UMoj0uLh8WqXPq+XkUIXu/grKgj66MdDUBjUrbXE8Ykn7Uw2gfgwp3GZRec5TWNvBqp8aXGYgOqTjGr3Vnox+hIhEOyCSkm0im8Y0eUQj7vAqu0bTvm6RLatedll5eHr9lp0hPHsSkX/YHHPc7ZIDDoYmCBzZrCMz4w17Fziw4ouh5fxffJs1ulr8o8dyXI64r7OK88IuwG4CDbR2s+iXSK8zBZbPk56lyOFrwuPZH1dfA7+7ilKCsUVxd5wUakI/Vw0VLj8EVdMII+DUODzNw4lOr+99TcaszpUfZ7GwceIsjJ9uszJ5tmo+DJmiqdriIv0LfxetuOry2gTpE9e93gLEibx0jfW02SzTWKCeHOMUgyVl4Wf9dFXgEZxv/FyNto69MtfnjqqW66+T51Lp0uScmIjmcmzzeNzmsQh2T6fNBfeDrcq69vdhbWpeNjfy8L2KVk9G0GrskL4cbL3JbRCuKGXs0rgI3h/3xaBDK9JRk2G7Pk4w9Vp4MnScxg+GbHkqOFI5qy2Sd3OcD3EyHmec+tWnlyHQ1x9iK5nGRZw8ldUPFe7hR+QEbyceQ4r67Ovtz3ibxW1u6tsvOpRxu2gdcTEJWH6tKViKHi4FYcTo/OntxN3xzMVvIoOns8mBUgw2+2F8hwyLc/Y9mFpt4rn4M9DbGhXOqzhrFK/RHQs0n7i3nJd7+Us1k6C+Wy02ek62S2rUEW+AkLWOeYYo7wdw8iRrZUd70F1trGD6GCekfsojp7XXijK13Zhwmpj+80PzqL3NGlQp0vIMLF+w5UwafI2jdlLh3ojkV0uX+D1W9c8KB5TQgiYka6wcOtdtITSum4TgwnDJeLqZa3oe+hmOunwOBCHf0Sc50H4wN60TmUnIxjSc1y8nbuzcIPEm+nwC8scFqRP55s7slz2S+Q0WtJLh0cadRbD5ytYYqZG58aF2r3ChSopNd0fgckYhpAJdvw4gTQ4HZHiz0aR2+c08/dSntkp3pDdkCyvNkN9VM+HR6pDGLwGCTpnb/Vy0F2LMbG65VE0I/jmh6PL7FthF/x8dEMJ6bKqzyfn2ek68PSycqI40HxuUndtLdbuF1950EuaobcTNxTRfyYx6WSIOAUQnkBbd5pePRdylE6dZu9cP+x33kTUFfuZzsHKSzd+pbJ+F631vpidAnIOFapwEpt1Crlv7iChgPOUuXdRTDco3fZK/kPY+4oRPO84iWrAk770AQh7xcBh/dXkavKzT1js7g6LTyejLmUvEyv24Y163cDUfoa02/XYZ9svJGcG93WyJtnZ19virzRQ5/HyiH1vj+rrGjVNC7K+f6UWft6t82i7jkL69f3x61ev3ih9VnFr8UI4/0VBSEWHsFD8UbCmu+AsTwMqyaqcRTFLDLXW9UuqAIpm/RBIPiwFgRlW8GT1pKFFLjkjWxIzwiAGYdpUR9eJZFg44E40tEpT1TYa7044oTTLKt/9W+jooacovZF5+u5rfEbWJCdHpRHBDJYsDJbqxKXzbTnIlPEs3mjJ8SSpTtNpFsJVnD3QfXm0wSlB7WhOIF0F2VqCqtLB1efY8lX2q4++Hl/APiWrSDGH5i9gBdlagqrSZydgZb/2S8DwVtyc5Gvq5XEK6eptbY4iXMVpPDUAi7/GNyftyILA/OjCAE57hoouAW3zbRBZsbNgGJmpe4VpiiNxanmJH8makqfXRQ4jOJAGqmmUieA+DyJJLiPaV3javqDlh11GTCo714T2LQI8WToJj0WRNI1J2ITv+y4GfGfmLwcctaXSbdJ5x7nB4U1egHS11JVIC7knkuTApRnJl0TvlEqncjdw0D1NDVUFcUV7Ij8S2XMVGM6vZA6isqBYi08DiMpQFs/oVvP4ouWyrF6kyWYycdJ7dWe3i2SXhvoFTqoqjKdSNopkIV3UDYRqqwwilzKXRhDMLl78GkrsbvtTC/BNkK5IrrfQEPKBFIiDQBs5uq+CbX5bMpWEl86fer1clssauf3qZBD20PK+tGRD+fhihJOX1qd3EgERI83cfghDaucUccLsm1QIWNB/IMAoyk8KoMNTJRcNo8ysjBxGBE2BgzQtcpROJIN1eB8mf0IqedxZiaGOKI0GuFGEsu2nQBj/eSBhRHJ1GJnk+oeSR4XY6cWyOemxRRDiDUR9HdFINMA9b7HEcnUWYqkSO71YNuHikNeaGnhBHHUwz1sUMZychRiKhE4vgmUcN63Ilc6O/FhWX5z2EVOJBeCqOQshmNShQtox1KRrRcB58J7plsBxjMffCPDxOSeRrIv0bfUKmF1OcB3Q30/40S9Ti8ZoeqaDVMjBqqYSDhbxgtYuooY2/0aa4hp4we7RwYyim7jOCVQJ34exfDC8HEYY+c5hmpvS6GavmL4kS0KFr9VSA2ultk3x4JT7vN/aiOsJprWW8dMdp7diQPeDFGf9QX+g7jqIaKFgeMYVDMfx8iYdRU+Re3RuTOYgJddJcpCRWckIPyKTSYj8ULu4eRE/IU0bczXpNsYIOoqho3ZcoBEqHup+Bs3uYUQX6CqmVZDuiaW4DoZRXjHLX7WyKwNqZIEvHlVGhW4ZSRvyBhtgw4jSKfbQRUDrmnPSsRVNkeFRR28F9aKE0lF5TS6Uk/vjAEI5xAGq3jacywI87mloR3md/EQUEJffyN2CpCyvulZgWhBpdMUCpz3FXORG6MJ8JaclczrZUYItVf414kfsPsNSUfG0MQK7iR7QEVH4QIDhXGnQDBxIJKHuolZBmPY5yefIi+GMJGvkBbGrDDVL4lSPTkCxGcULYU7SMtoZfWdBqXO5Tn9ZuEsnOamf7k5v3DNY12u8ajxqw2oWF8pfyPf8Otnl5CAhM5AQNhqzEo8ihqVJKjJFIJTFZb6CMMo64ioDjLAJx36z2cWVB3qRkGK1S4PK4U0oxL1Q0FeRXFC0YI56RU++JF8mwKH8TVDsG0oKDR1GLV4y9VN54KZB+DsLsFu4AbONk/AB4QoOw4uu4BoYN99diVJx26YUDuTejeDOMBKn9BC1yRIqzU3EcDoPhAbFq4emm5Vwjf6uqo9oTai72M7ww4riuozvk2rzPvDWXWpSwSeU7feGXe7O7PfqF0HI3AbKRDjLX/T+An5E4WOU5exaOicbSRCkkv0WA7EzKNOmHoApT21Csm2Cpo0QO69pUd521V/3PW5e2xVMY9fkHzuSTedee/59S0Iqg9ck21JU7LoTHbFVqmoM3mqBHSeSldJXUZ6B4oFC75m5MYKQAn3FtDptmFhVVEewY+YiNKMtYx1FY1KDpnmiKz6U5H8iL931VQR9ZgAb9dW24RmdDmQYlYZk9TAiq+kqSqPJdM9Lgvfmqe/cBHLcu/0eAji5w5tG8kaNMjAXqRk9+kAHgSkH5na6J+PRmtwEq+z2whTV7kINaXcBxrMbSB/VVCoUlB8HkZ6L0cLeNR3BtFWQlUwvLyydrFYRBCt53pdfnq2wlP2bm6xQwOm8Z/M8CB82pIhFwQaiRXjLgi7fsoSyZFnOstub5LatoH9cwtcRo0wIBQ4OjFyjgica/x2xCHYSGoHoEWRHy2Gn5saWneKw742Ps8yhXha5y9D+nYO6ys60+UMu48cor/1NIOVTJ5qheqeF9ZSpSK9t+KaEXGf896G0zYjComWpU3Njy0n7g7+I1mseTQXxaEkH45Ye2V1ufJ0EaeifoxAJlM5BoAr/qHTTBLxsLwUMQqWvpIRb0sKNk71xOqE09H2GgqlSO9XejQ8PB62KQh5RujTiMm07phI1O5l0PYXqJEhjJ//seyA1tozwqXssFviMUhwhxWhv0xvhpWgWObMEiaqyNeiFyW/+jHFFYdRcGXgpmDpDhiAAjGzhRtFgCimwogUEFD9D/QJ0c1bSNeU169d0FcTV00ohsKRhtRLrCMMoF81Y1UikzkoieNomDSGosXK56ILUxgUecPV5sWgLK4h46ObPvh0/luDMrdtKKtgf7CKkwErJR9TicZLT4WTJW6YRpZuzEqiGvInDDKE0TjnsI+mcujE51tCgR83j6h2Qn05NjSshckQkvfKZcyw9pFDtfbw8rGTNLkIeGKzKIGs+grMgYqCNLDddo6+MKTkKjVOmptliDWcKO6Lt3LQm5RZ5VhY0zFKntrwLyXlxQt5En2juNJbkIkqz/CzIg7sgU10HWa0FyRtiy5N21s/jo7IUuDEoixfhA9kE74+Xdwkd7uCumFDZ9gvJWblye6JtjG1ZLQ22IPpGaxi3hi2N2hp0a+x0HUQbS4sVjLnZAsit7U/JKootbVcw5rYLIHvb8p2C0rAMALXKwyAG9prQ+RsV/khAg0Ip1FoDgOydvlvG/tixi25yShNiMdROC2FvrLw+ku+mlUZhMKhxGNLG0PiRrKnuhHnKFYJsrcoRnTXdx6t9NkGDXTdVsJGm80FRydJBgiTpgFFi0WQDjXMbUWZ4vaBoq1gIlI+BFYpkAIgEHsYuPdz9ltIaVwY1VBUj2pDzxastyRBgezwQYl608LZx1kGCI6wDtilA6d2JqgIlAFAJCpn1rBwAk7ir3QfBwL6DkBYq+CdkStt8IdRiXY7prCFHONBnAzTcdUMFqyQa8kQD0miAhiXSUMFGmi5nsEqWDhIkSQdsIwe4WVUpAYBAIgA4S/tC1D6lYaEUarEBwK3aYNJCcMUGIXWrNQhsU9Hc1ljVzlwhqJircnuvoXNDpTkICLTfJTiMPjSmUYI0o7GCRkca6yA5JKUC0TJJgjPxiQN1JgNFA5YAa+tisgOlXbEYarGFQMgkeLqodhYEA7urQCJXL2PcfXgJM1bRrmPGWtbFTL13BNYwFQheulQ4q4o2Bb4EdLYJHFbiuhoora6NAwopdi2wRrdr4W2nJuzcbRdquSSVQ61zIHY+qPH7VMtPAQHtPwEKsxvWRb4EDBoNJGzQaICx5NhkAYYzkuIkAUqoPIUEBQJqXACyj4YUl01pUyqHWqxAMKZbHfkLMtzqMo3Zxort3fmUrED81XcINy1CHL0BwX/UEyMACDw5kuAwx2WWqFrAyYilBnw2YqmE3Ehad9I6QNMGk4e1M8wQtkfllQEYZJMB3nriGKZPW8phYZFnFyXgCaQeGD6R1MPbRi6A5031HRyXADFv2qf1Cuq2CMLeliJaAEk3HVXjDqmvghU5I/dRHGkFWQUBt18ClPNxHP6cDFvRenjX/kCY5/xbZtUq50tBY5wHsFpJ3PsxwEbiSmELiQNALMdQI9V33dKLGNzyVhrcw2sQV0WIHSHMmKZEt/fDMKS9UIcORg3Ut6VSC9ytMtcL8V61SPNdTFYOuu6WBlS++IafpfG3v7R5qFC5QlcxabFAGISLdAqNYAePrnpzB3ACgPJMuj829mBC8fawvobWc4EHw3VC2wE0G4RbdgVNVeqXEfWduIURFdhYjBCu/BU0ValfRmgVBAA1FhvGmBZ1oArw6lvlhglc3ynTTX3RMczNu4BRcmMokDTf/DGlvZ43sKIB8kKuWE9xLiircp+9dZZ3ItH3loPy313ADaaoK3zv3WEOm+UiX2UDuq5tMlj8E7hZgXQzmICRoiMURoBAYIscKa5YrThxRXNjxoLirZ2mrMzggIdmxrCKU793zG4XyS4NwUmFqKXvkMbtpOiYUmZgjNt+GUKP9Rnxy9abIF2xqz43tla1DFoK0X9kh/eXzaXrE4q3Faih47ILVtm39iueaS4y3oENUmhf0BtI5QiilkHaDD5MpaghfJIEjPDxcYFLLurNsNa9yeg/pPIMV9HENqs3VMU9tFuTgF916irQ8Z99Ms/k4WRknqGiScNZ/bUqLYd2vJqSeTpfLCPjNJUMTDN7kpUMw7mFTcmsKly5mTlQTHOBaOF4t6AXPL0dvaO6rAB2rQ0nEOjXgcnUshAXRvKpVTlhgPYrAWOyQEizrvEZVFmBqGXQEGaXx1JD4PwXBbyA02aBS/je3wRsnyC2AgEagCCgX0lR3TVLi4/77LPDdJ2jNkL9wdJpCdhjJzS1GQGjsOE6SbBMEED3nQWqQ67NyRW4TXPFYdwSINx4682BgzOu0IreVbnADBV7Y7Tg1Hurus/q2Wupae+u6vArdJcvRjAP9GIGEfraogJyVjURaa55jRUGlI/5MsxkFprAhzINp5yKXD9bp3IkY7gK+s5Bvu5Ft8SCubEH8Ia3u5YDXOuCx3LsgXCjb88+HFzhRaYbXg2UbAcBhmG8ccIaKww2ZefEHv2e3gTu12KfiiHCjm2X2ux4E/hQZuw4+ze+Z1/I9/w62eUEwwYR+PkwgRFm63sBY+5ypvTWPBHG6qj+2Y/pHQ3Ejk6YjMcgljdC9UkI8rWPxF7786iK3ybA/keq0vMe7QMa4KAVWdV0Fm18BFSdRaNe9IhrouZZU7kyKoXDMdF6fYSqiGCgXjwxr5AmZZ70nqnM8Q3wCoTzu/hrHl81tYWy/qfbQcg2/6cpoUOy/AU8L1Bg/HYYfPdV1JVKfKxo5dOu0iVKs6AJIF5cYOQ1TXx7Vq9o9df+PkRqznqES6a1kkED4N6ElbrA7WGXyHLt07eS+0DxEMzUKQcdqN/pMgUTnFPdG65E0TgM8mZ9UleKGvpxHLiZNdyw6UCGYrRpz+6UxN3jrn2GbLLfxyPyjXu7m5+CMWKebGgt1yfSFjpxoTqZXdg9zOQ3lk098P1kj+6xtM6m3ilpn8UR4p+YlgNSfpmwa70SEUOnVd4SG4tuB0BoxtLpQCgwHW6pbzTLMy3D48ue7Kxy89q4BKXw9WLyjdPlrtlkoddKPhLTemEd8My2qGt6P9uTdboEqzY+oRKzinaMOeRlacTg4ldOzTRTElEb49AJSBUPIUso0/psDBuTdAImdkx2afM8w2MyMKD3K0Sk9dSXbWL+RxtrDNkiVY3V+6HMSCxoEhbaeg9nNhQP6ns8MRipu0B6PlvHbRn9RN2iDS1ZqhRrsMiRmGLKLAcwBJ2ITiAfDjRc9EMumoQJV2451DS+eF2zsHm81kPekHVn0ZWaUEzPDQDYMGEUaOnxgy1030iM6JQBy+DA44RnKLmRoq00jjx+LBRjSigzaywppJRO+HWRG4clQO4iC1Ns2Y78u4KMyJpOqXngFyXueIaaYHK8oUX1ysJVK7FsZax+477QlL07KcMVVR/ozzxJgxX5TIlbZ8XXdyfXdKWONqT8dUayaNWieEdxxqQYxhZpDcNuC+vMPBJFNUhdXA3jZ5IHyyAPPqR5dB+EOS1mDyejeHV89Guw3hX28R1ZXsZfd/l2l9Muk83dWoi8yLL8mNp/d6LQ/O5r+VbGRxcomRHtAvka/7KL1suG7otgnUnLjw4FSx/0V0K/V3vHlLnTPjWYviQxElHFvibrUa3Fsq/xIngkXWij1tMnsgrCJ/r9MVqynZgOiX0gRLa/O4uCVRpssgpHW5/+pDK83Hz/9/8Pmx+V8S9UBAA= + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.Designer.cs b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.Designer.cs new file mode 100644 index 0000000000..04c3cd89a6 --- /dev/null +++ b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class Remove_WebServiceDO_ActivityCategoryEnum : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(Remove_WebServiceDO_ActivityCategoryEnum)); + + string IMigrationMetadata.Id + { + get { return "201608090542310_Remove_WebServiceDO_ActivityCategoryEnum"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.cs b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.cs new file mode 100644 index 0000000000..d001c5fced --- /dev/null +++ b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.cs @@ -0,0 +1,37 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class Remove_WebServiceDO_ActivityCategoryEnum : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + DropForeignKey("dbo.ActivityTemplate", "WebServiceId", "dbo.WebServices"); + DropIndex("dbo.ActivityTemplate", new[] { "WebServiceId" }); + DropColumn("dbo.ActivityTemplate", "Category"); + DropColumn("dbo.ActivityTemplate", "WebServiceId"); + DropTable("dbo.WebServices"); + } + + public override void Down() + { + CreateTable( + "dbo.WebServices", + c => new + { + Id = c.Int(nullable: false, identity: true), + Name = c.String(), + IconPath = c.String(), + LastUpdated = c.DateTimeOffset(nullable: false, precision: 7), + CreateDate = c.DateTimeOffset(nullable: false, precision: 7), + }) + .PrimaryKey(t => t.Id); + + AddColumn("dbo.ActivityTemplate", "WebServiceId", c => c.Int()); + AddColumn("dbo.ActivityTemplate", "Category", c => c.Int(nullable: false)); + CreateIndex("dbo.ActivityTemplate", "WebServiceId"); + AddForeignKey("dbo.ActivityTemplate", "WebServiceId", "dbo.WebServices", "Id"); + } + } +} diff --git a/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.resx b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.resx new file mode 100644 index 0000000000..eca97805b4 --- /dev/null +++ b/Data/Migrations/201608090542310_Remove_WebServiceDO_ActivityCategoryEnum.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608091020235_FixUp_Migration_2.Designer.cs b/Data/Migrations/201608091020235_FixUp_Migration_2.Designer.cs new file mode 100644 index 0000000000..b4b52c00fa --- /dev/null +++ b/Data/Migrations/201608091020235_FixUp_Migration_2.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class FixUp_Migration_2 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(FixUp_Migration_2)); + + string IMigrationMetadata.Id + { + get { return "201608091020235_FixUp_Migration_2"; } + } + + string IMigrationMetadata.Source + { + get { return Resources.GetString("Source"); } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608091020235_FixUp_Migration_2.cs b/Data/Migrations/201608091020235_FixUp_Migration_2.cs new file mode 100644 index 0000000000..7cffdfab05 --- /dev/null +++ b/Data/Migrations/201608091020235_FixUp_Migration_2.cs @@ -0,0 +1,37 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class FixUp_Migration_2 : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + // DropForeignKey("dbo.ActivityTemplate", "WebServiceId", "dbo.WebServices"); + // DropIndex("dbo.ActivityTemplate", new[] { "WebServiceId" }); + // DropColumn("dbo.ActivityTemplate", "Category"); + // DropColumn("dbo.ActivityTemplate", "WebServiceId"); + // DropTable("dbo.WebServices"); + } + + public override void Down() + { + // CreateTable( + // "dbo.WebServices", + // c => new + // { + // Id = c.Int(nullable: false, identity: true), + // Name = c.String(), + // IconPath = c.String(), + // LastUpdated = c.DateTimeOffset(nullable: false, precision: 7), + // CreateDate = c.DateTimeOffset(nullable: false, precision: 7), + // }) + // .PrimaryKey(t => t.Id); + // + // AddColumn("dbo.ActivityTemplate", "WebServiceId", c => c.Int()); + // AddColumn("dbo.ActivityTemplate", "Category", c => c.Int(nullable: false)); + // CreateIndex("dbo.ActivityTemplate", "WebServiceId"); + // AddForeignKey("dbo.ActivityTemplate", "WebServiceId", "dbo.WebServices", "Id"); + } + } +} diff --git a/Data/Migrations/201608091020235_FixUp_Migration_2.resx b/Data/Migrations/201608091020235_FixUp_Migration_2.resx new file mode 100644 index 0000000000..ea17145fa5 --- /dev/null +++ b/Data/Migrations/201608091020235_FixUp_Migration_2.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.Designer.cs b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.Designer.cs new file mode 100644 index 0000000000..b887e80e1e --- /dev/null +++ b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class ConvertedTerminalIdToGuid : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(ConvertedTerminalIdToGuid)); + + string IMigrationMetadata.Id + { + get { return "201608091306036_ConvertedTerminalIdToGuid"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.cs b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.cs new file mode 100644 index 0000000000..0809825cab --- /dev/null +++ b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.cs @@ -0,0 +1,143 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class ConvertedTerminalIdToGuid : System.Data.Entity.Migrations.DbMigration + { + public override void Up() + { + DropForeignKey("dbo.Subscriptions", "TerminalId", "dbo.Terminals"); + DropForeignKey("dbo.ActivityTemplate", "TerminalId", "dbo.Terminals"); + DropForeignKey("dbo.AuthorizationTokens", "TerminalID", "dbo.Terminals"); + DropForeignKey("dbo.TerminalSubscription", "TerminalId", "dbo.Terminals"); + + DropIndex("dbo.Subscriptions", new[] { "TerminalId" }); + DropIndex("dbo.ActivityTemplate", new[] { "TerminalId" }); + DropIndex("dbo.AuthorizationTokens", new[] { "TerminalID" }); + DropIndex("dbo.TerminalSubscription", new[] { "TerminalId" }); + + RenameTable("dbo.Terminals", "OldTerminals"); + + CreateTable( + "dbo.Terminals", + c => new + { + Id = c.Guid(nullable: false), + Secret = c.String(), + Name = c.String(), + Version = c.String(), + Label = c.String(), + TerminalStatus = c.Int(nullable: false), + Endpoint = c.String(nullable: false), + Description = c.String(), + AuthenticationType = c.Int(), + LastUpdated = c.DateTimeOffset(nullable: false, precision: 7), + CreateDate = c.DateTimeOffset(nullable: false, precision: 7), + UserId = c.String(maxLength: 128), + IsFr8OwnTerminal = c.Boolean(nullable: false), + DevUrl = c.String(), + ProdUrl = c.String(), + ParticipationState = c.Int(nullable: false, defaultValue: 1), + OldId = c.Int(nullable: false) + }) + .PrimaryKey(t => t.Id) + .ForeignKey("dbo._AuthenticationTypeTemplate", t => t.AuthenticationType, true, "FK_dbo.Terminals_dbo._AuthenticationTypeTemplate_AuthenticationType_") + .ForeignKey("dbo._TerminalStatusTemplate", t => t.TerminalStatus, true, "FK_dbo.Terminals_dbo._TerminalStatusTemplate_TerminalStatus_") + .ForeignKey("dbo.Users", t => t.UserId, false, "FK_dbo.Terminals_dbo._Users_UserId_") + .ForeignKey("dbo._ParticipationStateTemplate", t => t.ParticipationState, true, "FK_dbo.Terminals_dbo._ParticipationStateTemplate_ParticipationState_") + .Index(t => t.TerminalStatus) + .Index(t => t.AuthenticationType) + .Index(t => t.ParticipationState) + .Index(t => t.UserId); + + Sql( + @"INSERT INTO [dbo].[Terminals] ( + [Id], + [Secret], + [Name], + [Version], + [Label], + [TerminalStatus], + [Endpoint], + [Description], + [AuthenticationType], + [LastUpdated], + [CreateDate], + [UserId], + [IsFr8OwnTerminal], + [DevUrl], + [ProdUrl], + [ParticipationState], + [OldId]) + SELECT + newid() as [Id], + [ot].[Secret], + [ot].[Name], + [ot].[Version], + [ot].[Label], + [ot].[TerminalStatus], + [ot].[Endpoint], + [ot].[Description], + [ot].[AuthenticationType], + [ot].[LastUpdated], + [ot].[CreateDate], + [ot].[UserId], + [ot].[IsFr8OwnTerminal], + [ot].[DevUrl], + [ot].[ProdUrl], + [ot].[ParticipationState], + [ot].[Id] as [OldId] + FROM [dbo].[OldTerminals] AS [ot]" + ); + /* dbo.Subscriptions Modifications */ + RenameColumn("dbo.Subscriptions", "TerminalId", "OldTerminalId"); + AddColumn("dbo.Subscriptions", "TerminalId", c => c.Guid(nullable: true)); + Sql("UPDATE [SB] SET [TerminalId] = [T].[Id] FROM [dbo].[Subscriptions] AS [SB] INNER JOIN [dbo].[Terminals] [T] ON [T].[OldId] = [SB].[OldTerminalId]"); + AlterColumn("dbo.Subscriptions", "TerminalId", c => c.Guid(nullable: false)); + CreateIndex("dbo.Subscriptions", "TerminalId"); + AddForeignKey("dbo.Subscriptions", "TerminalId", "dbo.Terminals", "Id"); + DropColumn("dbo.Subscriptions", "OldTerminalId"); + /* dbo.ActivityTemplate Modifications */ + RenameColumn("dbo.ActivityTemplate", "TerminalId", "OldTerminalId"); + AddColumn("dbo.ActivityTemplate", "TerminalId", c => c.Guid(nullable: true)); + Sql("UPDATE [AT] SET [TerminalId] = [T].[Id] FROM [dbo].[ActivityTemplate] AS [AT] INNER JOIN [dbo].[Terminals] [T] ON [T].[OldId] = [AT].[OldTerminalId]"); + AlterColumn("dbo.ActivityTemplate", "TerminalId", c => c.Guid(nullable: false)); + CreateIndex("dbo.ActivityTemplate", "TerminalId"); + AddForeignKey("dbo.ActivityTemplate", "TerminalId", "dbo.Terminals", "Id"); + DropColumn("dbo.ActivityTemplate", "OldTerminalId"); + /* dbo.AuthorizationTokens Modifications */ + RenameColumn("dbo.AuthorizationTokens", "TerminalID", "OldTerminalId"); + AddColumn("dbo.AuthorizationTokens", "TerminalID", c => c.Guid(nullable: true)); + Sql("UPDATE [AT] SET [TerminalId] = [T].[Id] FROM [dbo].[AuthorizationTokens] AS [AT] INNER JOIN [dbo].[Terminals] [T] ON [T].[OldId] = [AT].[OldTerminalId]"); + AlterColumn("dbo.AuthorizationTokens", "TerminalID", c => c.Guid(nullable: false)); + CreateIndex("dbo.AuthorizationTokens", "TerminalID"); + AddForeignKey("dbo.AuthorizationTokens", "TerminalID", "dbo.Terminals", "Id"); + DropColumn("dbo.AuthorizationTokens", "OldTerminalId"); + /* dbo.TerminalSubscription Modifications */ + RenameColumn("dbo.TerminalSubscription", "TerminalId", "OldTerminalId"); + AddColumn("dbo.TerminalSubscription", "TerminalId", c => c.Guid(nullable: true)); + Sql("UPDATE [AT] SET [TerminalId] = [T].[Id] FROM [dbo].[TerminalSubscription] AS [AT] INNER JOIN [dbo].[Terminals] [T] ON [T].[OldId] = [AT].[OldTerminalId]"); + AlterColumn("dbo.TerminalSubscription", "TerminalId", c => c.Guid(nullable: false)); + CreateIndex("dbo.TerminalSubscription", "TerminalId"); + AddForeignKey("dbo.TerminalSubscription", "TerminalId", "dbo.Terminals", "Id"); + DropColumn("dbo.TerminalSubscription", "OldTerminalId"); + + //Modify ObjectRolePermission ObjectId for terminals + Sql(@"UPDATE o SET o.ObjectId = t.Id + FROM Terminals t + INNER JOIN ObjectRolePermissions o ON + o.ObjectId = t.OldId + WHERE o.Type = 'TerminalDO'"); + + //Remove leftovers + DropColumn("dbo.Terminals", "OldId"); + DropTable("dbo.OldTerminals"); + } + + public override void Down() + { + + } + } +} diff --git a/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.resx b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.resx new file mode 100644 index 0000000000..ca579f2f64 --- /dev/null +++ b/Data/Migrations/201608091306036_ConvertedTerminalIdToGuid.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.Designer.cs b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.Designer.cs new file mode 100644 index 0000000000..df4d94b6a2 --- /dev/null +++ b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class ConvertMtDataIdToGuid : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(ConvertMtDataIdToGuid)); + + string IMigrationMetadata.Id + { + get { return "201608091310148_ConvertMtDataIdToGuid"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.cs b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.cs new file mode 100644 index 0000000000..2e0bbe1fab --- /dev/null +++ b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.cs @@ -0,0 +1,206 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + public partial class ConvertMtDataIdToGuid : System.Data.Entity.Migrations.DbMigration + { + private const string CreateMTDataTableQuery = @"CREATE TABLE [dbo].[MtData]( + [Id] [uniqueidentifier] NOT NULL DEFAULT(newid()), + [Type] [uniqueidentifier] NOT NULL, + [CreatedAt] [datetime] NOT NULL, + [UpdatedAt] [datetime] NOT NULL, + [fr8AccountId] [nvarchar](max) NOT NULL, + [IsDeleted] [bit] NOT NULL, + [Value1] [nvarchar](max) NULL, + [Value2] [nvarchar](max) NULL, + [Value3] [nvarchar](max) NULL, + [Value4] [nvarchar](max) NULL, + [Value5] [nvarchar](max) NULL, + [Value6] [nvarchar](max) NULL, + [Value7] [nvarchar](max) NULL, + [Value8] [nvarchar](max) NULL, + [Value9] [nvarchar](max) NULL, + [Value10] [nvarchar](max) NULL, + [Value11] [nvarchar](max) NULL, + [Value12] [nvarchar](max) NULL, + [Value13] [nvarchar](max) NULL, + [Value14] [nvarchar](max) NULL, + [Value15] [nvarchar](max) NULL, + [Value16] [nvarchar](max) NULL, + [Value17] [nvarchar](max) NULL, + [Value18] [nvarchar](max) NULL, + [Value19] [nvarchar](max) NULL, + [Value20] [nvarchar](max) NULL, + [Value21] [nvarchar](max) NULL, + [Value22] [nvarchar](max) NULL, + [Value23] [nvarchar](max) NULL, + [Value24] [nvarchar](max) NULL, + [Value25] [nvarchar](max) NULL, + [Value26] [nvarchar](max) NULL, + [Value27] [nvarchar](max) NULL, + [Value28] [nvarchar](max) NULL, + [Value29] [nvarchar](max) NULL, + [Value30] [nvarchar](max) NULL, + [Value31] [nvarchar](max) NULL, + [Value32] [nvarchar](max) NULL, + [Value33] [nvarchar](max) NULL, + [Value34] [nvarchar](max) NULL, + [Value35] [nvarchar](max) NULL, + [Value36] [nvarchar](max) NULL, + [Value37] [nvarchar](max) NULL, + [Value38] [nvarchar](max) NULL, + [Value39] [nvarchar](max) NULL, + [Value40] [nvarchar](max) NULL, + [Value41] [nvarchar](max) NULL, + [Value42] [nvarchar](max) NULL, + [Value43] [nvarchar](max) NULL, + [Value44] [nvarchar](max) NULL, + [Value45] [nvarchar](max) NULL, + [Value46] [nvarchar](max) NULL, + [Value47] [nvarchar](max) NULL, + [Value48] [nvarchar](max) NULL, + [Value49] [nvarchar](max) NULL, + [Value50] [nvarchar](max) NULL, + [OldId] [nvarchar](max) NULL, + CONSTRAINT [PK_dbo.MTData_PK] PRIMARY KEY CLUSTERED +( + [Id] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"; + private const string CopyDataFromOldMtDataQuery = @"INSERT INTO [dbo].[MTData] ( + [Id], + [Type], + [CreatedAt], + [UpdatedAt], + [fr8AccountId], + [IsDeleted], + [Value1], + [Value2], + [Value3], + [Value4], + [Value5], + [Value6], + [Value7], + [Value8], + [Value9], + [Value10], + [Value11], + [Value12], + [Value13], + [Value14], + [Value15], + [Value16], + [Value17], + [Value18], + [Value19], + [Value20], + [Value21], + [Value22], + [Value23], + [Value24], + [Value25], + [Value26], + [Value27], + [Value28], + [Value29], + [Value30], + [Value31], + [Value32], + [Value33], + [Value34], + [Value35], + [Value36], + [Value37], + [Value38], + [Value39], + [Value40], + [Value41], + [Value42], + [Value43], + [Value44], + [Value45], + [Value46], + [Value47], + [Value48], + [Value49], + [Value50], + [OldId]) + SELECT + newid() as [Id], + [mt].[Type], + [mt].[CreatedAt], + [mt].[UpdatedAt], + [mt].[fr8AccountId], + [mt].[IsDeleted], + [mt].[Value1], + [mt].[Value2], + [mt].[Value3], + [mt].[Value4], + [mt].[Value5], + [mt].[Value6], + [mt].[Value7], + [mt].[Value8], + [mt].[Value9], + [mt].[Value10], + [mt].[Value11], + [mt].[Value12], + [mt].[Value13], + [mt].[Value14], + [mt].[Value15], + [mt].[Value16], + [mt].[Value17], + [mt].[Value18], + [mt].[Value19], + [mt].[Value20], + [mt].[Value21], + [mt].[Value22], + [mt].[Value23], + [mt].[Value24], + [mt].[Value25], + [mt].[Value26], + [mt].[Value27], + [mt].[Value28], + [mt].[Value29], + [mt].[Value30], + [mt].[Value31], + [mt].[Value32], + [mt].[Value33], + [mt].[Value34], + [mt].[Value35], + [mt].[Value36], + [mt].[Value37], + [mt].[Value38], + [mt].[Value39], + [mt].[Value40], + [mt].[Value41], + [mt].[Value42], + [mt].[Value43], + [mt].[Value44], + [mt].[Value45], + [mt].[Value46], + [mt].[Value47], + [mt].[Value48], + [mt].[Value49], + [mt].[Value50], + [mt].[Id] as [OldId] + FROM [dbo].[OldMTData] AS [mt]"; + public override void Up() + { + RenameTable("dbo.MTData", "OldMTData"); + Sql(CreateMTDataTableQuery); + Sql(CopyDataFromOldMtDataQuery); + //Copy ids of PlanTemplates to ObjectRolePermissions + Sql(@"UPDATE o SET o.ObjectId = t.Id + FROM ObjectRolePermissions o + INNER JOIN MtData t ON + o.ObjectId = t.OldId + WHERE LEN(ObjectId) != 36 AND o.Type = 'Plan Template'"); + //Remove leftovers + DropColumn("dbo.MtData", "OldId"); + DropTable("dbo.OldMTData"); + } + public override void Down() + { + } + } +} diff --git a/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.resx b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.resx new file mode 100644 index 0000000000..ca579f2f64 --- /dev/null +++ b/Data/Migrations/201608091310148_ConvertMtDataIdToGuid.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.Designer.cs b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.Designer.cs new file mode 100644 index 0000000000..1cccfa2bdb --- /dev/null +++ b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class ConvertObjectIdToGuidAndCreateIndexOnOPR : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(ConvertObjectIdToGuidAndCreateIndexOnOPR)); + + string IMigrationMetadata.Id + { + get { return "201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.cs b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.cs new file mode 100644 index 0000000000..0beeebd515 --- /dev/null +++ b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.cs @@ -0,0 +1,67 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class ConvertObjectIdToGuidAndCreateIndexOnOPR : System.Data.Entity.Migrations.DbMigration + { + private const string CreateObjectRolePermissionsTableQuery = @"CREATE TABLE [dbo].[ObjectRolePermissions]( + [Id] [uniqueidentifier] NOT NULL DEFAULT (newsequentialid()), + [ObjectId] [uniqueidentifier] NOT NULL, + [RolePermissionId] [uniqueidentifier] NOT NULL, + [Type] [nvarchar](max) NULL, + [PropertyName] [nvarchar](max) NULL, + [LastUpdated] [datetimeoffset](7) NOT NULL, + [CreateDate] [datetimeoffset](7) NOT NULL, + [Fr8AccountId] [nvarchar](128) NOT NULL DEFAULT (''), + [OrganizationId] [int] NULL, + CONSTRAINT [PK_dbo.ObjectRolePermissions_] PRIMARY KEY CLUSTERED + ( + [Id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + + ALTER TABLE [dbo].[ObjectRolePermissions] WITH CHECK ADD CONSTRAINT [FK_dbo.ObjectRolePermissions_dbo.RolePermissions_RolePermissionId_] FOREIGN KEY([RolePermissionId]) + REFERENCES [dbo].[RolePermissions] ([Id]) + + ALTER TABLE [dbo].[ObjectRolePermissions] CHECK CONSTRAINT [FK_dbo.ObjectRolePermissions_dbo.RolePermissions_RolePermissionId_] + "; + public override void Up() + { + RenameTable("dbo.ObjectRolePermissions", "OldObjectRolePermissions"); + Sql(CreateObjectRolePermissionsTableQuery); + //copy data from existing table - parse object ids as guid + Sql( + @"INSERT INTO [dbo].[ObjectRolePermissions] ( + [Id], + [ObjectId], + [RolePermissionId], + [Type], + [PropertyName], + [LastUpdated], + [CreateDate], + [Fr8AccountId], + [OrganizationId]) + SELECT + [ot].[Id], + CAST([ot].[ObjectId] AS UNIQUEIDENTIFIER), + [ot].[RolePermissionId], + [ot].[Type], + [ot].[PropertyName], + [ot].[LastUpdated], + [ot].[CreateDate], + [ot].[Fr8AccountId], + [ot].[OrganizationId] + FROM [dbo].[OldObjectRolePermissions] AS [ot]" + ); + DropTable("dbo.OldObjectRolePermissions"); + CreateIndex("dbo.ObjectRolePermissions", "ObjectId"); + } + + public override void Down() + { + DropIndex("dbo.ObjectRolePermissions", new[] { "ObjectId" }); + } + + } +} diff --git a/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.resx b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.resx new file mode 100644 index 0000000000..ca579f2f64 --- /dev/null +++ b/Data/Migrations/201608091313044_ConvertObjectIdToGuidAndCreateIndexOnOPR.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/201608092230355_OperationalState1.Designer.cs b/Data/Migrations/201608092230355_OperationalState1.Designer.cs new file mode 100644 index 0000000000..ba1ee27aae --- /dev/null +++ b/Data/Migrations/201608092230355_OperationalState1.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.0-30225")] + public sealed partial class OperationalState1 : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(OperationalState1)); + + string IMigrationMetadata.Id + { + get { return "201608092230355_OperationalState1"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Data/Migrations/201608092230355_OperationalState1.cs b/Data/Migrations/201608092230355_OperationalState1.cs new file mode 100644 index 0000000000..3936bb0d4d --- /dev/null +++ b/Data/Migrations/201608092230355_OperationalState1.cs @@ -0,0 +1,33 @@ +namespace Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class OperationalState1 : DbMigration + { + public override void Up() + { + CreateTable( + "dbo._OperationalStateTemplate", + c => new + { + Id = c.Int(nullable: false), + Name = c.String(), + }) + .PrimaryKey(t => t.Id); + + Sql("INSERT INTO dbo._OperationalStateTemplate(Id, Name) VALUES (0, 'Undiscovered')"); + AddColumn("dbo.Terminals", "OperationalState", c => c.Int(nullable: false, defaultValue: 0)); + CreateIndex("dbo.Terminals", "OperationalState"); + AddForeignKey("dbo.Terminals", "OperationalState", "dbo._OperationalStateTemplate", "Id", cascadeDelete: true); + } + + public override void Down() + { + DropForeignKey("dbo.Terminals", "OperationalState", "dbo._OperationalStateTemplate"); + DropIndex("dbo.Terminals", new[] { "OperationalState" }); + DropColumn("dbo.Terminals", "OperationalState"); + DropTable("dbo._OperationalStateTemplate"); + } + } +} diff --git a/Data/Migrations/201608092230355_OperationalState1.resx b/Data/Migrations/201608092230355_OperationalState1.resx new file mode 100644 index 0000000000..03d989fca3 --- /dev/null +++ b/Data/Migrations/201608092230355_OperationalState1.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Data/Migrations/Configuration.cs b/Data/Migrations/Configuration.cs deleted file mode 100644 index 97a3dff4e8..0000000000 --- a/Data/Migrations/Configuration.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace Data.Migrations -{ - using System; - using System.Data.Entity; - using System.Data.Entity.Migrations; - using System.Linq; - - internal sealed class Configuration : DbMigrationsConfiguration - { - public Configuration() - { - AutomaticMigrationsEnabled = false; - } - - protected override void Seed(Data.Infrastructure.DockyardDbContext context) - { - // This method will be called after migrating to the latest version. - - // You can use the DbSet.AddOrUpdate() helper extension method - // to avoid creating duplicate seed data. E.g. - // - // context.People.AddOrUpdate( - // p => p.FullName, - // new Person { FullName = "Andrew Peters" }, - // new Person { FullName = "Brice Lambson" }, - // new Person { FullName = "Rowan Miller" } - // ); - // - } - } -} diff --git a/Data/Migrations/DockyardDbMigration.cs b/Data/Migrations/DbMigration.cs similarity index 90% rename from Data/Migrations/DockyardDbMigration.cs rename to Data/Migrations/DbMigration.cs index 6d0e706c40..489c9d3796 100644 --- a/Data/Migrations/DockyardDbMigration.cs +++ b/Data/Migrations/DbMigration.cs @@ -7,7 +7,7 @@ namespace Data.Migrations { - public abstract class DockyardDbMigration : DbMigration + public abstract class DbMigration : System.Data.Entity.Migrations.DbMigration { protected void SeedConstants(string tableName, bool setIdentityInsertOn = false) { diff --git a/Data/Migrations/MigrationConfiguration.cs b/Data/Migrations/MigrationConfiguration.cs index 60eab1f50a..fc305996e2 100644 --- a/Data/Migrations/MigrationConfiguration.cs +++ b/Data/Migrations/MigrationConfiguration.cs @@ -11,8 +11,10 @@ using Data.Entities; using Data.Infrastructure; using Data.Interfaces; +using Fr8.Infrastructure.Data.DataTransferObjects; using StructureMap; using System.Text.RegularExpressions; +using Fr8.Infrastructure.Data.States; namespace Data.Migrations { @@ -21,7 +23,7 @@ public sealed partial class MigrationConfiguration : DbMigrationsConfiguration x.DevUrl != null && + (string.Equals(NormalizeUrl(x.DevUrl), devUrl, StringComparison.OrdinalIgnoreCase) + || + (ExtractPort(x.DevUrl) != null && ExtractPort(devUrl) != null && + string.Equals(ExtractPort(x.DevUrl), terminalPort, StringComparison.OrdinalIgnoreCase) + ))); - if (uow.TerminalRegistrationRepository.GetAll().FirstOrDefault(x => - string.Equals(ExtractTerminalAuthority(x.Endpoint), terminalEndpoint, StringComparison.OrdinalIgnoreCase) || - (ExtractPort(x.Endpoint) != null && ExtractPort(terminalEndpoint) != null && string.Equals(ExtractPort(x.Endpoint), terminalPort, StringComparison.OrdinalIgnoreCase)) - ) != null) + if (existingTerminal != null) { return; } - terminalRegistration.Endpoint = terminalEndpoint; - terminalRegistration.IsFr8OwnTerminal = true; + terminalRegistration.Id = Guid.NewGuid(); + terminalRegistration.Endpoint = devUrl; + terminalRegistration.DevUrl = devUrl; + terminalRegistration.ProdUrl = prodUrl; + terminalRegistration.IsFr8OwnTerminal = isFr8OwnTerminal; + terminalRegistration.TerminalStatus = TerminalStatus.Undiscovered; + terminalRegistration.ParticipationState = ParticipationState.Unapproved; - uow.TerminalRegistrationRepository.Add(terminalRegistration); + uow.TerminalRepository.Add(terminalRegistration); uow.SaveChanges(); } - private static string ExtractTerminalAuthority(string terminalUrl) + private static string NormalizeUrl(string terminalUrl) { + if (string.IsNullOrEmpty(terminalUrl)) + { + return string.Empty; + } + var terminalAuthority = terminalUrl; if (!terminalUrl.Contains("http:") & !terminalUrl.Contains("https:")) @@ -351,7 +373,6 @@ private static void AddRoles(IUnitOfWork uow) private static void AddAdmins(IUnitOfWork unitOfWork) { CreateAdmin("alex@edelstein.org", "foobar", unitOfWork); - CreateAdmin("d1984v@gmail.com", "dmitry123", unitOfWork); CreateAdmin("y.gnusin@gmail.com", "123qwe", unitOfWork); CreateAdmin("alexavrutin@gmail.com", "123qwe", unitOfWork); CreateAdmin("bahadir.bb@gmail.com", "123456ab", unitOfWork); @@ -363,7 +384,6 @@ private static void AddAdmins(IUnitOfWork unitOfWork) CreateAdmin("maki.gjuroski@gmail.com", "123qwe", unitOfWork); CreateAdmin("fr8system_monitor@fr8.company", "123qwe", unitOfWork); CreateAdmin("teh.netaholic@gmail.com", "123qwe", unitOfWork); - CreateAdmin("farrukh.normuradov@gmail.com", "123qwe", unitOfWork); } /// @@ -373,11 +393,11 @@ private static void AddAdmins(IUnitOfWork unitOfWork) /// True if created successfully otherwise false private static void AddDockyardAccounts(IUnitOfWork unitOfWork) { - CreateDockyardAccount("alexlucre1@gmail.com", "lucrelucre", unitOfWork); - CreateDockyardAccount("diagnostics_monitor@dockyard.company", "testpassword", unitOfWork); - CreateDockyardAccount("fileupload@dockyard.company", "test123", unitOfWork); - CreateDockyardAccount("sacre", "printf", unitOfWork); - CreateDockyardAccount("integration_test_runner@fr8.company", "fr8#s@lt!", unitOfWork); + CreateFr8Account("alexlucre1@gmail.com", "lucrelucre", unitOfWork); + CreateFr8Account("diagnostics_monitor@dockyard.company", "testpassword", unitOfWork); + CreateFr8Account("fileupload@dockyard.company", "test123", unitOfWork); + CreateFr8Account("sacre", "printf", unitOfWork); + CreateFr8Account("integration_test_runner@fr8.company", "fr8#s@lt!", unitOfWork); } /// /// Add test user with 'Admin' role @@ -425,7 +445,7 @@ private static void CreateTestAccount(string userEmail, string curPassword, stri /// /// /// - public static Fr8AccountDO CreateDockyardAccount(string userEmail, string curPassword, IUnitOfWork uow) + public static Fr8AccountDO CreateFr8Account(string userEmail, string curPassword, IUnitOfWork uow) { var user = uow.UserRepository.GetOrCreateUser(userEmail); uow.UserRepository.UpdateUserCredentials(userEmail, userEmail, curPassword); @@ -434,53 +454,83 @@ public static Fr8AccountDO CreateDockyardAccount(string userEmail, string curPas return user; } - private void AddWebServices(IUnitOfWork uow) + private void AddPredefinedActivityCategories(IUnitOfWork uow) { - var terminalToWs = new Dictionary - { - {"terminalSalesforce", "Salesforce"}, - {"terminalFr8Core", "fr8 Core"}, - {"terminalDocuSign", "DocuSign"}, - {"terminalSlack", "Slack"}, - {"terminalTwilio", "Twilio"}, - {"terminalAzure", "Microsoft Azure"}, - {"terminalExcel", "Excel"}, - {"terminalGoogle", "Google"}, - {"terminalPapertrail", "Papertrail"} + var predefinedCategories = new List>() + { + new Tuple(ActivityCategories.MonitorId, ActivityCategories.MonitorName, "/Content/icons/monitor-icon-64x64.png"), + new Tuple(ActivityCategories.ReceiveId, ActivityCategories.ReceiveName, "/Content/icons/get-icon-64x64.png"), + new Tuple(ActivityCategories.ProcessId, ActivityCategories.ProcessName, "/Content/icons/process-icon-64x64.png"), + new Tuple(ActivityCategories.ForwardId, ActivityCategories.ForwardName, "/Content/icons/forward-icon-64x64.png"), + new Tuple(ActivityCategories.SolutionId, ActivityCategories.SolutionName, null) }; - var wsToId = new Dictionary(); + foreach (var category in predefinedCategories) + { + AddOrUpdateActivityCategory(uow, category.Item1, category.Item2, category.Item3); + } + } + + private void AddOrUpdateActivityCategory(IUnitOfWork uow, Guid id, string name, string iconPath) + { + var activityTemplateAssignments = new List(); - AddWebService(uow, "AWS", "/Content/icons/web_services/aws-icon-64x64.png"); - AddWebService(uow, "Slack", "/Content/icons/web_services/slack-icon-64x64.png"); - AddWebService(uow, "DocuSign", "/Content/icons/web_services/docusign-icon-64x64.png"); - AddWebService(uow, "Microsoft Azure", "/Content/icons/web_services/ms-azure-icon-64x64.png"); - AddWebService(uow, "Excel", "/Content/icons/web_services/ms-excel-icon-64x64.png"); - AddWebService(uow, "Built-In Services", "/Content/icons/web_services/fr8-core-icon-64x64.png"); - AddWebService(uow, "Salesforce", "/Content/icons/web_services/salesforce-icon-64x64.png"); - AddWebService(uow, "SendGrid", "/Content/icons/web_services/sendgrid-icon-64x64.png"); - AddWebService(uow, "Dropbox", "/Content/icons/web_services/dropbox-icon-64x64.png"); - AddWebService(uow, "Atlassian", "/Content/icons/web_services/jira-icon-64x64.png"); - AddWebService(uow, "UnknownService", "/Content/icons/web_services/unknown-service.png"); + var existingActivityCategoryByName = uow.ActivityCategoryRepository + .GetQuery() + .FirstOrDefault(x => x.Name == name && x.Id != id); - foreach (var webServiceDo in uow.WebServiceRepository.GetAll()) + if (existingActivityCategoryByName != null) { - if (webServiceDo.Name != null) + var existingAssignments = uow.ActivityCategorySetRepository.GetQuery() + .Where(x => x.ActivityCategoryId == existingActivityCategoryByName.Id) + .ToList(); + + foreach (var assignment in existingAssignments) { - wsToId[webServiceDo.Name] = webServiceDo.Id; + activityTemplateAssignments.Add(assignment.ActivityTemplate); + uow.ActivityCategorySetRepository.Remove(assignment); } + uow.SaveChanges(); + + uow.ActivityCategoryRepository.Remove(existingActivityCategoryByName); + uow.SaveChanges(); } - foreach (var activity in uow.ActivityTemplateRepository.GetQuery().Include(x => x.Terminal)) - { - string wsName; - int wsId; + var activityCategory = uow.ActivityCategoryRepository + .GetQuery() + .FirstOrDefault(x => x.Id == id); - if (terminalToWs.TryGetValue(activity.Terminal.Name, out wsName) && wsToId.TryGetValue(wsName, out wsId)) + if (activityCategory == null) + { + activityCategory = new ActivityCategoryDO() { - activity.WebServiceId = wsId; - } + Id = id, + Name = name, + IconPath = iconPath + }; + + uow.ActivityCategoryRepository.Add(activityCategory); } + else + { + activityCategory.IconPath = iconPath; + } + + foreach (var assignedActivityTemplate in activityTemplateAssignments) + { + if (!string.IsNullOrEmpty(assignedActivityTemplate.Terminal.Name)) + { + uow.ActivityCategorySetRepository.Add( + new ActivityCategorySetDO() + { + Id = Guid.NewGuid(), + ActivityCategoryId = activityCategory.Id, + ActivityCategory = activityCategory, + ActivityTemplateId = assignedActivityTemplate.Id, + ActivityTemplate = assignedActivityTemplate + }); + } + } uow.SaveChanges(); } @@ -512,23 +562,6 @@ private void RegisterTestUser(IUnitOfWork uow, string userName, string password, uow.AspNetUserRolesRepository.AssignRoleToUser(roleId, userDO.Id); } - private void AddWebService(IUnitOfWork uow, string name, string iconPath) - { - var isWsExists = uow.WebServiceRepository.GetQuery().Any(x => x.Name == name); - - if (isWsExists) - { - return; - } - var webServiceDO = new WebServiceDO - { - Name = name, - IconPath = iconPath - }; - - uow.WebServiceRepository.Add(webServiceDO); - } - private void UpdateRootPlanNodeId(IUnitOfWork uow) { var anyRootIdFlag = uow.PlanRepository.GetNodesQueryUncached().Any(x => x.RootPlanNodeId != null); @@ -716,8 +749,8 @@ private static PermissionSetDO AddPermissionSet( Name = name, ProfileId = profileId, ObjectType = objectType, - CreateDate = DateTimeOffset.Now, - LastUpdated = DateTimeOffset.Now, + CreateDate = DateTimeOffset.UtcNow, + LastUpdated = DateTimeOffset.UtcNow, HasFullAccess = isFullSet }; @@ -732,7 +765,7 @@ private static PermissionSetDO AddPermissionSet( if (isFullSet) { permissionSet.Permissions.Add(repo.GetQuery().FirstOrDefault(x => x.Id == (int)PermissionType.ViewAllObjects)); - permissionSet.Permissions.Add(repo.GetQuery().FirstOrDefault(x => x.Id == (int)PermissionType.ModifyAllObjects)); + permissionSet.Permissions.Add(repo.GetQuery().FirstOrDefault(x => x.Id == (int)PermissionType.EditAllObjects)); permissionSet.Permissions.Add(repo.GetQuery().FirstOrDefault(x => x.Id == (int)PermissionType.EditPageDefinitions)); } diff --git a/Data/Repositories/Authorization/AuthorizationTokenRepositoryBase.cs b/Data/Repositories/Authorization/AuthorizationTokenRepositoryBase.cs index 9d3eaceb7b..77d4ebca46 100644 --- a/Data/Repositories/Authorization/AuthorizationTokenRepositoryBase.cs +++ b/Data/Repositories/Authorization/AuthorizationTokenRepositoryBase.cs @@ -88,7 +88,7 @@ public IQueryable GetPublicDataQuery() /*********************************************************************************/ - public AuthorizationTokenDO FindToken(string userId, int terminalId, int? state) + public AuthorizationTokenDO FindToken(string userId, Guid terminalId, int? state) { AuthorizationTokenDO token; @@ -106,7 +106,7 @@ public AuthorizationTokenDO FindToken(string userId, int terminalId, int? state) /*********************************************************************************/ - public AuthorizationTokenDO FindTokenByExternalAccount(string externalAccountId, int terminalId, string userId) + public AuthorizationTokenDO FindTokenByExternalAccount(string externalAccountId, Guid terminalId, string userId) { return SyncAndLoadSecretData(_storageProvider.GetQuery() .FirstOrDefault(x => x.ExternalAccountId == externalAccountId @@ -116,7 +116,7 @@ public AuthorizationTokenDO FindTokenByExternalAccount(string externalAccountId, /*********************************************************************************/ - public AuthorizationTokenDO FindTokenByExternalState(string externalStateToken, int terminalId) + public AuthorizationTokenDO FindTokenByExternalState(string externalStateToken, Guid terminalId) { return SyncAndLoadSecretData(_storageProvider.GetQuery() .FirstOrDefault(x => x.TerminalID == terminalId diff --git a/Data/Repositories/Authorization/IAuthorizationTokenRepository.cs b/Data/Repositories/Authorization/IAuthorizationTokenRepository.cs index b828139ded..a7f4f6fd2f 100644 --- a/Data/Repositories/Authorization/IAuthorizationTokenRepository.cs +++ b/Data/Repositories/Authorization/IAuthorizationTokenRepository.cs @@ -9,9 +9,9 @@ public interface IAuthorizationTokenRepository IQueryable GetPublicDataQuery(); void Add(AuthorizationTokenDO newToken); void Remove(AuthorizationTokenDO token); - AuthorizationTokenDO FindToken(string userId, int terminalId, int? state); - AuthorizationTokenDO FindTokenByExternalState(string externalStateToken, int terminalId); - AuthorizationTokenDO FindTokenByExternalAccount(string externalAccountId, int terminalId, string userId); + AuthorizationTokenDO FindToken(string userId, Guid terminalId, int? state); + AuthorizationTokenDO FindTokenByExternalState(string externalStateToken, Guid terminalId); + AuthorizationTokenDO FindTokenByExternalAccount(string externalAccountId, Guid terminalId, string userId); AuthorizationTokenDO FindTokenById(Guid? id); int Count(); } diff --git a/Data/Repositories/MultiTenant/IMtObjectsStorage.cs b/Data/Repositories/MultiTenant/IMtObjectsStorage.cs index 1765debbb6..c7d0e9889e 100644 --- a/Data/Repositories/MultiTenant/IMtObjectsStorage.cs +++ b/Data/Repositories/MultiTenant/IMtObjectsStorage.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Data.Repositories.MultiTenant.Ast; using Data.Repositories.SqlBased; @@ -13,6 +14,6 @@ interface IMtObjectsStorage int QueryScalar (ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where); int Delete(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where); - int? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where); + Guid? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where); } } \ No newline at end of file diff --git a/Data/Repositories/MultiTenant/MultitenantRepository.cs b/Data/Repositories/MultiTenant/MultitenantRepository.cs index 9bcfdcd025..ac2336263b 100644 --- a/Data/Repositories/MultiTenant/MultitenantRepository.cs +++ b/Data/Repositories/MultiTenant/MultitenantRepository.cs @@ -195,7 +195,7 @@ public int Count(string fr8AccountId, Expression> where) return _mtObjectsStorage.QueryScalar(_connectionProvider, fr8AccountId, mtType, ConvertToAst(where, mtType)); } - public int? GetObjectId(string fr8AccountId, Expression> where) + public Guid? GetObjectId(string fr8AccountId, Expression> where) where T : Manifest { var mtType = _typeStorage.ResolveType(_connectionProvider, typeof(T), _typeStorageProvider, false); diff --git a/Data/Repositories/MultiTenant/StorageImpl/InMemory/InMemoryMtObjectsStorage.cs b/Data/Repositories/MultiTenant/StorageImpl/InMemory/InMemoryMtObjectsStorage.cs index 5be29e90ab..b85d6ee4a8 100644 --- a/Data/Repositories/MultiTenant/StorageImpl/InMemory/InMemoryMtObjectsStorage.cs +++ b/Data/Repositories/MultiTenant/StorageImpl/InMemory/InMemoryMtObjectsStorage.cs @@ -113,7 +113,7 @@ public int QueryScalar(ISqlConnectionProvider connectionProvider, string fr8Acco return count; } - public int? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where) + public Guid? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where) { return null; } diff --git a/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtObjectsStorage.cs b/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtObjectsStorage.cs index f95bd1a522..858e983078 100644 --- a/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtObjectsStorage.cs +++ b/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtObjectsStorage.cs @@ -16,7 +16,6 @@ public partial class SqlMtObjectsStorage : IMtObjectsStorage public SqlMtObjectsStorage(IMtObjectConverter converter) { _converter = converter; - //_connectionString = ConfigurationManager.ConnectionStrings["DockyardDB"].ConnectionString; } private SqlConnection OpenConnection(ISqlConnectionProvider connectionProvider) @@ -295,7 +294,7 @@ public int Delete(ISqlConnectionProvider connectionProvider, string fr8AccountId } } - public int? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where) + public Guid? GetObjectId(ISqlConnectionProvider connectionProvider, string fr8AccountId, MtTypeDefinition type, AstNode where) { if (where == null) { @@ -325,8 +324,7 @@ public int Delete(ISqlConnectionProvider connectionProvider, string fr8AccountId { return null; } - - return reader.GetInt32(0); + return reader.GetGuid(0); } } } diff --git a/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtTypeStorageProvider.cs b/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtTypeStorageProvider.cs index 72213de0f8..9339468a0b 100644 --- a/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtTypeStorageProvider.cs +++ b/Data/Repositories/MultiTenant/StorageImpl/SqlBased/SqlMtTypeStorageProvider.cs @@ -18,7 +18,6 @@ class SqlMtTypeStorageProvider : IMtTypeStorageProvider public SqlMtTypeStorageProvider(IMtTypeStorage storage) { _storage = storage; - // _connectionString = ConfigurationManager.ConnectionStrings["DockyardDB"].ConnectionString; } private SqlConnection OpenConnection(ISqlConnectionProvider connectionProvider) diff --git a/Data/Repositories/Security/Entities/ObjectRolePermissionsWrapper.cs b/Data/Repositories/Security/Entities/ObjectRolePermissionsWrapper.cs index f0f5d99d0e..3766d30bef 100644 --- a/Data/Repositories/Security/Entities/ObjectRolePermissionsWrapper.cs +++ b/Data/Repositories/Security/Entities/ObjectRolePermissionsWrapper.cs @@ -19,7 +19,7 @@ public ObjectRolePermissionsWrapper() /// /// Identifier of Secured Object. In general Primary Key(GUID) of Data Object. /// - public string ObjectId { get; set; } + public Guid ObjectId { get; set; } /// /// Type of the object diff --git a/Data/Repositories/Security/ISecurityObjectsStorageProvider.cs b/Data/Repositories/Security/ISecurityObjectsStorageProvider.cs index 1f20adb262..bbb8ad85ce 100644 --- a/Data/Repositories/Security/ISecurityObjectsStorageProvider.cs +++ b/Data/Repositories/Security/ISecurityObjectsStorageProvider.cs @@ -10,13 +10,13 @@ public interface ISecurityObjectsStorageProvider { int InsertRolePermission(RolePermission rolePermission); int UpdateRolePermission(RolePermission rolePermission); - int InsertObjectRolePermission(string currentUserId, string dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null); - int RemoveObjectRolePermission(string dataObjectId, Guid rolePermissionId, string propertyName = null); - ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(string dataObjectId, string dataObjectType); + int InsertObjectRolePermission(string currentUserId, Guid dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null); + int RemoveObjectRolePermission(Guid dataObjectId, Guid rolePermissionId, string propertyName = null); + ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType); List GetAllPermissionsForUser(Guid profileId); - List GetObjectBasedPermissionSetForObject(string dataObjectId, string dataObjectType, Guid profileId); - void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, string dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId, List customPermissionTypes = null); + List GetObjectBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType, Guid profileId); + void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, Guid dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId, List customPermissionTypes = null); RolePermission GetRolePermission(string roleName, Guid permissionSetId); - List GetAllowedUserRolesForSecuredObject(string objectId, string objectType); + List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType); } } diff --git a/Data/Repositories/Security/StorageImpl/Cache/SecurityObjectsStorage.cs b/Data/Repositories/Security/StorageImpl/Cache/SecurityObjectsStorage.cs index 602cf613a3..7c1d427d04 100644 --- a/Data/Repositories/Security/StorageImpl/Cache/SecurityObjectsStorage.cs +++ b/Data/Repositories/Security/StorageImpl/Cache/SecurityObjectsStorage.cs @@ -39,7 +39,7 @@ public int UpdateRolePermission(RolePermission rolePermission) return _securityObjectStorageProvider.UpdateRolePermission(rolePermission); } - public int InsertObjectRolePermission(string currentUserId, string dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null) + public int InsertObjectRolePermission(string currentUserId, Guid dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null) { var affectedRows = _securityObjectStorageProvider.InsertObjectRolePermission(currentUserId, dataObjectId, rolePermissionId, dataObjectType, propertyName); @@ -48,7 +48,7 @@ public int InsertObjectRolePermission(string currentUserId, string dataObjectId, return affectedRows; } - public int RemoveObjectRolePermission(string dataObjectId, Guid rolePermissionId, string propertyName = null) + public int RemoveObjectRolePermission(Guid dataObjectId, Guid rolePermissionId, string propertyName = null) { var affectedRows = _securityObjectStorageProvider.RemoveObjectRolePermission(dataObjectId, rolePermissionId, propertyName); @@ -57,7 +57,7 @@ public int RemoveObjectRolePermission(string dataObjectId, Guid rolePermissionId return affectedRows; } - public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(string dataObjectId, string dataObjectType) + public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType) { lock (_cache) { @@ -97,7 +97,7 @@ public List GetAllPermissionsForUser(Guid profileId) } } - public List GetObjectBasedPermissionSetForObject(string dataObjectId, string dataObjectType, Guid profileId) + public List GetObjectBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType, Guid profileId) { using (var uow = ObjectFactory.GetInstance()) { @@ -118,7 +118,7 @@ public List GetObjectBasedPermissionSetForObject(string dataObjectId, strin } } - public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, string dataObjectId, string dataObjectType, + public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, Guid dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId, List customPermissionTypes = null) { if (rolePermissionId == Guid.Empty) @@ -144,13 +144,13 @@ public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string InvokeCacheUpdate(dataObjectId, dataObjectType); } - + public RolePermission GetRolePermission(string roleName, Guid permissionSetId) { return _securityObjectStorageProvider.GetRolePermission(roleName, permissionSetId); } - public List GetAllowedUserRolesForSecuredObject(string objectId, string objectType) + public List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType) { return _securityObjectStorageProvider.GetAllowedUserRolesForSecuredObject(objectId, objectType); } @@ -192,7 +192,7 @@ private PermissionSetDO GetOrCreateDefaultSecurityPermissionSet(string dataObjec } } - private void InvokeCacheUpdate(string dataObjectId, string dataObjectType) + private void InvokeCacheUpdate(Guid dataObjectId, string dataObjectType) { lock (_cache) { diff --git a/Data/Repositories/Security/StorageImpl/InMemorySecurityObjectsStorageProvider.cs b/Data/Repositories/Security/StorageImpl/InMemorySecurityObjectsStorageProvider.cs index 7fba755031..d6557b3311 100644 --- a/Data/Repositories/Security/StorageImpl/InMemorySecurityObjectsStorageProvider.cs +++ b/Data/Repositories/Security/StorageImpl/InMemorySecurityObjectsStorageProvider.cs @@ -25,7 +25,7 @@ public InMemorySecurityObjectsStorageProvider(ISqlConnectionProvider sqlConnecti editRolePrivilegeID = Guid.Parse("7cb466dc-8fed-4791-a1ba-09f9135416db"); } - public int InsertObjectRolePermission(string currentUserId, string dataObjectId, Guid rolePrivilegeId, string dataObjectType, + public int InsertObjectRolePermission(string currentUserId, Guid dataObjectId, Guid rolePrivilegeId, string dataObjectType, string propertyName = null) { lock (ObjectRolePermissions) @@ -58,7 +58,7 @@ public int InsertRolePermission(RolePermission rolePrivilege) throw new NotImplementedException(); } - public int RemoveObjectRolePermission(string dataObjectId, Guid rolePrivilegeId, string propertyName = null) + public int RemoveObjectRolePermission(Guid dataObjectId, Guid rolePrivilegeId, string propertyName = null) { throw new NotImplementedException(); } @@ -72,12 +72,12 @@ public List GetAllPermissionsForUser(Guid profileId) throw new NotImplementedException(); } - public List GetObjectBasedPermissionSetForObject(string dataObjectId, string dataObjectType, Guid profileId) + public List GetObjectBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType, Guid profileId) { return new List(); } - public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, string dataObjectId, + public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, Guid dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId, List permissionTypes = null) { //refactor in security unit tests rework @@ -88,12 +88,12 @@ public RolePermission GetRolePermission(string roleName, Guid permissionSetId) throw new NotImplementedException(); } - public List GetAllowedUserRolesForSecuredObject(string objectId, string objectType) + public List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType) { return new List(); } - public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(string dataObjectId, string dataObjectType) + public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType) { lock (ObjectRolePermissions) { diff --git a/Data/Repositories/Security/StorageImpl/SqlBased/SqlSecurityObjectsStorageProvider.cs b/Data/Repositories/Security/StorageImpl/SqlBased/SqlSecurityObjectsStorageProvider.cs index 980979ba14..c5a0a2d2d2 100644 --- a/Data/Repositories/Security/StorageImpl/SqlBased/SqlSecurityObjectsStorageProvider.cs +++ b/Data/Repositories/Security/StorageImpl/SqlBased/SqlSecurityObjectsStorageProvider.cs @@ -80,7 +80,7 @@ from dbo.RolePermissions rp } } - public List GetAllowedUserRolesForSecuredObject(string objectId, string objectType) + public List GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType) { using (var connection = OpenConnection(_sqlConnectionProvider)) { @@ -157,7 +157,7 @@ private int Upsert(ISqlConnectionProvider sqlConnectionProvider, RolePermission } } - public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(string dataObjectId, string dataObjectType) + public ObjectRolePermissionsWrapper GetRecordBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType) { using (var connection = OpenConnection(_sqlConnectionProvider)) { @@ -219,7 +219,7 @@ public List GetAllPermissionsForUser(Guid profileId) throw new NotImplementedException(); } - public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, string dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId = null, List customPermissionTypes = null) + public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string roleName, Guid dataObjectId, string dataObjectType, Guid rolePermissionId, int? organizationId = null, List customPermissionTypes = null) { using (var connection = OpenConnection(_sqlConnectionProvider)) { @@ -250,7 +250,7 @@ public void SetDefaultRecordBasedSecurityForObject(string currentUserId, string } } - public int InsertObjectRolePermission(string currentUserId, string dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null) + public int InsertObjectRolePermission(string currentUserId, Guid dataObjectId, Guid rolePermissionId, string dataObjectType, string propertyName = null) { using (var connection = OpenConnection(_sqlConnectionProvider)) { @@ -281,12 +281,12 @@ public int InsertObjectRolePermission(string currentUserId, string dataObjectId, } } - public int RemoveObjectRolePermission(string dataObjectId, Guid rolePermissionId, string propertyName = null) + public int RemoveObjectRolePermission(Guid dataObjectId, Guid rolePermissionId, string propertyName = null) { throw new NotImplementedException(); } - public List GetObjectBasedPermissionSetForObject(string dataObjectId, string dataObjectType, Guid profileId) + public List GetObjectBasedPermissionSetForObject(Guid dataObjectId, string dataObjectType, Guid profileId) { return new List(); } @@ -320,7 +320,7 @@ private void ReadObjectRolePermissionFromSql(SqlDataReader reader, ObjectRolePer { var obj = ReadRolePermissionFromSql(reader); - objectRolePermissionsWrapper.ObjectId = reader["ObjectId"] != DBNull.Value ? (string) reader["ObjectId"] : string.Empty; + objectRolePermissionsWrapper.ObjectId = reader["ObjectId"] != DBNull.Value ? (Guid) reader["ObjectId"] : Guid.Empty; objectRolePermissionsWrapper.Type = reader["Type"] != DBNull.Value ? (string)reader["Type"] : string.Empty; objectRolePermissionsWrapper.Fr8AccountId = reader["Fr8AccountId"] != DBNull.Value ? (string)reader["Fr8AccountId"] : string.Empty; objectRolePermissionsWrapper.OrganizationId = reader["OrganizationId"] != DBNull.Value ? (int?)reader["OrganizationId"] : null; diff --git a/Data/Repositories/TerminalRegistrationRepository.cs b/Data/Repositories/TerminalRegistrationRepository.cs deleted file mode 100644 index 22ff7ecc1d..0000000000 --- a/Data/Repositories/TerminalRegistrationRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Data.Entities; -using Data.Interfaces; - -namespace Data.Repositories -{ - public class TerminalRegistrationRepository : GenericRepository - { - public TerminalRegistrationRepository(IUnitOfWork uow) : base(uow) - { - } - } -} diff --git a/Data/Repositories/WebServiceRepository.cs b/Data/Repositories/WebServiceRepository.cs deleted file mode 100644 index 3a2d3a4f2c..0000000000 --- a/Data/Repositories/WebServiceRepository.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Data.Entities; -using Data.Interfaces; - -namespace Data.Repositories -{ - public class WebServiceRepository : GenericRepository, IWebServiceRepository - { - public WebServiceRepository(IUnitOfWork uow) : base(uow) - { - - } - } - - public interface IWebServiceRepository : IGenericRepository - { - - } -} \ No newline at end of file diff --git a/Data/States/OperationalState.cs b/Data/States/OperationalState.cs new file mode 100644 index 0000000000..fdc8c4411a --- /dev/null +++ b/Data/States/OperationalState.cs @@ -0,0 +1,11 @@ +namespace Data.States +{ + // If you add, change or remove items, please do the same in OperationalState.ts + // in order to keep front-end in sync with back-end. + public class OperationalState + { + public const int Undiscovered = 0; + public const int Active = 1; + public const int Inactive = 2; + } +} diff --git a/Data/States/ParticipationState.cs b/Data/States/ParticipationState.cs new file mode 100644 index 0000000000..498c4fa7de --- /dev/null +++ b/Data/States/ParticipationState.cs @@ -0,0 +1,11 @@ +namespace Data.States +{ + // If you add, change or remove items, please do the same in ParticipationState.ts + public class ParticipationState + { + public const int Unapproved = 0; + public const int Approved = 1; + public const int Blocked = 2; + public const int Deleted = 3; + } +} diff --git a/Data/States/PermissionType.cs b/Data/States/PermissionType.cs index b68090dd44..7c24deb512 100644 --- a/Data/States/PermissionType.cs +++ b/Data/States/PermissionType.cs @@ -1,5 +1,6 @@ namespace Data.States { + // When adding or changing items in this enum please also do the same in PermissionType.ts. public enum PermissionType { CreateObject = 1, @@ -8,7 +9,7 @@ public enum PermissionType DeleteObject = 4, RunObject = 5, ViewAllObjects = 6, - ModifyAllObjects = 7, + EditAllObjects = 7, ManageFr8Users = 8, ManageInternalUsers = 9, EditPageDefinitions = 10, diff --git a/Data/States/PlanState.cs b/Data/States/PlanState.cs index f21a4dadd7..f5c8d9f4b3 100644 --- a/Data/States/PlanState.cs +++ b/Data/States/PlanState.cs @@ -1,10 +1,62 @@ - -namespace Data.States +namespace Data.States { public class PlanState { public const int Inactive = 1; - public const int Running = 2; + public const int Executing = 2; public const int Deleted = 3; + public const int Active = 4; + + public static int StringToInt(string str) + { + int planState = 1; + + switch (str) + { + case "Inactive": + planState = Inactive; + break; + + case "Executing": + planState = Executing; + break; + + case "Active": + planState = Active; + break; + + case "Deleted": + planState = Deleted; + break; + } + + return planState; + } + + public static string IntToString(int planState) + { + string state = "Inactive"; + + switch (planState) + { + case Inactive: + state = "Inactive"; + break; + + case Active: + state = "Active"; + break; + + case Deleted: + state = "Deleted"; + break; + + case Executing: + state = "Executing"; + break; + } + + return state; + } } } \ No newline at end of file diff --git a/Data/States/Templates/_OperationalStateTemplate.cs b/Data/States/Templates/_OperationalStateTemplate.cs new file mode 100644 index 0000000000..a56f0122bd --- /dev/null +++ b/Data/States/Templates/_OperationalStateTemplate.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Data.States.Templates +{ + public class _OperationalStateTemplate : IStateTemplate + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public int Id { get; set; } + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } +} diff --git a/Data/States/Templates/_ParticipationStateTemplate.cs b/Data/States/Templates/_ParticipationStateTemplate.cs new file mode 100644 index 0000000000..6944beb15c --- /dev/null +++ b/Data/States/Templates/_ParticipationStateTemplate.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Data.States.Templates +{ + public class _ParticipationStateTemplate : IStateTemplate + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public int Id { get; set; } + public string Name { get; set; } + + public override string ToString() + { + return Name; + } + } +} diff --git a/Docs/ForDevelopers/ActivitiesLibrary.md b/Docs/ForDevelopers/ActivitiesLibrary.md index 34c8fa355a..5cb072041c 100644 --- a/Docs/ForDevelopers/ActivitiesLibrary.md +++ b/Docs/ForDevelopers/ActivitiesLibrary.md @@ -3,11 +3,14 @@ These special activities are part of the core Fr8 set: -## Collect Data -### ACTIVITY – COLLECT DATA +NEEDS UPDATING -This special and powerful activity allows the generation of Fr8lets, miniature applications that can be distributed to others, allowing them to run the application without dealing with the Fr8 Plan Builder complexity. +## App Builder + +### ACTIVITY – App Builder + +This special and powerful activity allows the generation of Fr8 Apps, miniature applications that can be distributed to others, allowing them to run the application without dealing with the Fr8 Plan Builder complexity. Collect Data makes use of Views, the ability of Activities to show different sets of UI depending on circumstances. The first View corresponds to Builder Mode, and allows the Power User to assemble a form from a set of form metacontrols: diff --git a/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md b/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md index 0398b19f10..b37b4db646 100644 --- a/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md +++ b/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md @@ -38,14 +38,16 @@ If an Activity can provide support for documentation requests (doing so is recom "displayMechanism":"HelpMenu" } ``` -If the client encounters this string, it will display the Help Menu Item in the Activity’s Settings menu and POST to /actions/documentation/ when the Help Menu is clicked/hovered. +If the client encounters this string, it will display the Help Menu Item in the Activity’s Settings menu and POST to `/activities/documentation/` when the Help Menu is clicked/hovered. -At tthat his point, the Activity should assemble HTML content and pack it into a “ShowDocumentation” [ActivityResponse](/Docs/ForDevelopers/Objects/Activities/ActivityResponses.md) [add to ActivityResponse docs] such as: +At that his point, the Activity should assemble HTML content and pack it into a `DocumentationResponse` which structure is displayed below: ```javascript { -"type": "ShowDocumentation" //Here might be Error, if contantPath is unknown -"body": "This solution interacts with the DocuSign service and provides a way to Track DocuSign Recipients. Yadda, yadda, yadda" +"name" : "Buil_Message", +"version": "1", +"terminal" : "Fr8 Core", +"body" : "

Some HTML goes here

" } ``` The client will render the provide content by popping up a help dialog window. @@ -56,7 +58,7 @@ The client will render the provide content by popping up a help dialog window. An Activity Overview is a page that describes an activity. It’s similar to the page generated by a Help Menu request (see above) but is intended for use outside of actual Plan design. An Activity Overview is a page that will show up in a directory of different activities, while Help Menu content will show up when the user is in the Plan Builder trying to build an actual Plan. -Activity Overviews are currently requested by the Fr8.co website on pages such as https://fr8.co/Services/DocuSign. To request an Activity Overview, the caller posts to /documentation with displayMechanism set to “MainPage”. The resulting data is formatted as a TerminalContent json element, which looks like this: +Activity Overviews are currently requested by the Fr8.co website on pages such as https://fr8.co/Services/DocuSign. To request an Activity Overview, the caller posts to `/activities/documentation` with displayMechanism set to “MainPage”. The resulting data is formatted as a TerminalContent json element, which looks like this: Element | Description | Notes --- | --- | --- diff --git a/Docs/ForDevelopers/Branching.md b/Docs/ForDevelopers/Branching.md index 1fd7720659..5e61812425 100644 --- a/Docs/ForDevelopers/Branching.md +++ b/Docs/ForDevelopers/Branching.md @@ -1,14 +1,14 @@ # ACTIVITY BRANCHING -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) -There are several ways to direct the flow of execution to a target Activity. They are activated by the Test and Branch Activity, which is found in the Processors Category, as one of the Built-In Fr8 Services: +There are several ways to direct the flow of execution to a target Activity. They are activated by the Make a Decision Activity, which is found in the Processors Category, as one of the Built-In Fr8 Services: -![Test_and_Branch](https://github.com/Fr8org/Fr8Core/blob/master/Docs/img/Branching_TestAndBranch.png) +![Test_and_Branch](/Docs/img/Branching_TestAndBranch.png) -Fr8 supports a ContainerTransition control that enables the following kinds of branching: +Fr8 supports a that enables the following kinds of branching: - Jump to a specific Activity - Jump to a specific Subplan - Jump to a specific Plan - [Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) + [Go to Contents](/Docs/Home.md) diff --git a/Docs/ForDevelopers/DevelopmentGuides/GettingDeployed.md b/Docs/ForDevelopers/DevelopmentGuides/GettingDeployed.md index 7932527a2d..7b028ea5f1 100644 --- a/Docs/ForDevelopers/DevelopmentGuides/GettingDeployed.md +++ b/Docs/ForDevelopers/DevelopmentGuides/GettingDeployed.md @@ -4,10 +4,11 @@ Getting your Terminal Deployed at Fr8.co If you've built a useful Terminal, we'd like to get it deployed and available to Fr8 users. There are two basic ways to do this: 1) You can invite The Fr8 Company to deploy it at fr8.co + 2) You can deploy it yourselve and invite The Fr8 Company to configure the production fr8.co Hub to discover it at your hosting endpoint -Getting Fr8.co To Deploy Your Terminal +Getting Fr8.co To Deploy Your Terminal to Production =================================== During development, it only takes a few mouse clicks on the Terminal Registration page to get the Fr8 Dev server to recognize your local Terminal (assuming @@ -17,3 +18,14 @@ To start this process, create a normal Pull Request and indicate in your descrip The Fr8 Company dev team will evaluate the Terminal. If it appears to be useful, we'll assign it to one of our devops people and deploy it. +Steps + +1. Go to My Terminals page on the Developer menu +2. click on the Terminal you want to deploy +3. Click on the Publish Terminal button: + +![](terminal_details.png) + +4. Fill out the Google Form, including the URL to a pull request corresponding to your working branch for your Terminal +5. Wait for a devops admin at The Fr8 Company to look over your pull request. + diff --git a/Docs/ForDevelopers/DevelopmentGuides/Guide-TerminalDiscovery.md b/Docs/ForDevelopers/DevelopmentGuides/Guide-TerminalDiscovery.md index 0676ececbe..dd71a1054a 100644 --- a/Docs/ForDevelopers/DevelopmentGuides/Guide-TerminalDiscovery.md +++ b/Docs/ForDevelopers/DevelopmentGuides/Guide-TerminalDiscovery.md @@ -13,13 +13,6 @@ If you are using the ["Public Hub" Development Approach](https://github.com/Fr8o So, in either case, your Terminal needs to stand ready to respond with information about itself. -### Creating a Terminal ID -You need to generate a GUID for your Terminal and provide that ID to the Hub. -[ADD MORE MATERIAL HERE] -For more information on Terminal ID's, see [Terminal Authentication](/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md). - - - ### Handling the /discover Request [Here's the API definition of a typical terminal](https://terminalfr8core.fr8.co/swagger/ui/index#!/Terminal/Terminal_Get). @@ -28,7 +21,6 @@ Here is an example of response your terminal should return in response to **/dis ```javascript { "Definition":{ - "id":"{generate some GUID value here}", "name":"MyTerminal", "label":"My Teriminal", "version":"1", @@ -37,6 +29,7 @@ Here is an example of response your terminal should return in response to **/dis }, "Activities":[ { + "id":"{generate some GUID value here}", "name":"My_fist_activity", "label":"My first activtiy", "version":"1", @@ -44,7 +37,16 @@ Here is an example of response your terminal should return in response to **/dis "name":"My Terminal", "iconPath":"http://terminal.com/my-terminal-icon.png" }, - "Category":"Processors", + "categories": [ + { + "name": "My Terminal", + "iconPath": "http://terminal.com/my-terminal-icon.png" + }, + { + "name": "Process", + "iconPath": "/Content/icons/monitor-icon-64x64.png" + } + ], "Type":"Standard", "minPaneWidth":330, "NeedsAuthentication":false, @@ -55,8 +57,7 @@ Here is an example of response your terminal should return in response to **/dis There are few important notes here: * All properties in the above JSON are mandatory. -* You should generate a GUID that will uniquely identify your terminal. This GUID should be returned as **Definition.Id** propery value. This GUID should never change unless and until you generate a new version of your Terminal (which will in most respects be treated as a completely different Terminal). GUID is represented by 32 hexadecimal digits separated by hyphens: 00000000-0000-0000-0000-000000000000. -* Asign **Definition.name** and **Definition.label** to anything you want. Note, that **Definition.label** is the text that is shown to users in fr8 UI in activity selection pane. +* Assign **Definition.name** and **Definition.label** to anything you want. Note, that **Definition.label** is the text that is shown to users in fr8 UI in activity selection pane. * **Definition.version** Set it to "1" initially. * **Definiton.endpoint** The address of the termninal's publically accessible HTTP endpoint. * **Definition.authenticationType** defines what kind of authentication your terminal is going to use. We will not use authentication for now. Read about possible values here [link to the page describing terminal authentication] @@ -64,21 +65,26 @@ There are few important notes here: Your /discover response informs the Hub about the Activities you're currently supporting. * For each activity you have to supply **name** and **label**. Name should be unique across your terminal. Label is shown to users in fr8 UI in the activity selection pane. -* Activtiy **version** Set it to "1" at the beginning. +* You should generate a GUID that will uniquely identify your activitiy. This GUID should be returned as **id** property value. This GUID **should never change** unless and until you generate a new version of your Activity. GUID is represented by 32 hexadecimal digits separated by hyphens: 00000000-0000-0000-0000-000000000000. +* Activtiy **version** Set it to "1" at the beginning. * If your Terminal communicates with branded web service(s), set the webService information so the Client will display correctly. * **iconPath** should be an absolute URL. * **NeedsAuthentication** flag should be set if this activity requires an authentication token. The Client checks for this before passing on /configure and /run requests, and instead displays the initial authentication UI to the user. -* + +> **Important!** +> You should **never** generate activity **Id** dynamically in your code. You should generate this unique identifier using some tool, like [this online GUID generator](https://www.guidgenerator.com/) and embed generated value into the code the same way you do this for **name** and **version** properties. Categories --------------- -This section is changing but until then, be aware of the following: - -Here's a correct set of category information for a terminal: -![](categories.png) +This section is changing but until then, be aware of the following: +* You have to fill **categories** property for each of your activity template. +* For each activity template you have to fill **categories** array with at least two items: + * Information about the general category of your activity: one of the four original Categories (Process, Forward, Monitor, Get) + * Information about your terminal. In general it is exactly the same info that is specified in **webService** property. -At this time, a category must be present in the categories json element for both a Web Service and one of the four original Categories (Process, Forwarder, Monitor, Get) +> **Important!** +> If you failed to populate **categories** property then your activity template will not be visible in the Plan Builder UI. This is being replaced by the work in JIRA FR-4943 diff --git a/Docs/ForDevelopers/DevelopmentGuides/terminal_details.png b/Docs/ForDevelopers/DevelopmentGuides/terminal_details.png new file mode 100644 index 0000000000..d8b89ea3e8 Binary files /dev/null and b/Docs/ForDevelopers/DevelopmentGuides/terminal_details.png differ diff --git a/Docs/ForDevelopers/Objects/Activities.md b/Docs/ForDevelopers/Objects/Activities.md index a4e2d311c5..11205176f7 100644 --- a/Docs/ForDevelopers/Objects/Activities.md +++ b/Docs/ForDevelopers/Objects/Activities.md @@ -1,6 +1,6 @@ # ACTIVITIES -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) An Activity represents a discrete piece of functionality that can be carried out by a Terminal. Terminals publish the set of Activities that they support, and Hubs make those Activities available to Clients providing user tools for creating Plans. @@ -10,24 +10,27 @@ Actions are added to Plans during the Design stage. They are ordered in a linear ### General Guides -[Development Guide – Activities](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/DevelopmentGuides/ActivityDevelopmentGuide.md) +[Development Guide – Activities](/Docs/ForDevelopers/DevelopmentGuides/ActivityDevelopmentGuide.md) + -[Activities Library](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/ActivitiesLibrary.md) ### Core Concepts -* [Configuration](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/OperatingConcepts/ActivityConfiguration.md) and [Controls](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/DevelopmentGuides/ConfigurationControls.md) -* [JSON Definition](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/ActivityJSONDefinition.md) -* [Registration](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/ActivitiesRegistration.md) -* [Signalling](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/Activities/Signalling.md) - * [Available Crate Data](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/CrateSignalling.md) -* [ActivityTemplates](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/ActivityTemplates.md) -* [Documentation](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md) +* [Configuration](/Docs/ForDevelopers/OperatingConcepts/ActivityConfiguration.md) and [Controls](/Docs/ForDevelopers/DevelopmentGuides/ConfigurationControls.md) +* [JSON Definition](/Docs/ForDevelopers/ActivityJSONDefinition.md) +* [Registration](/Docs/ForDevelopers/ActivitiesRegistration.md) +* [Signaling](/Docs/ForDevelopers/Objects/Activities/Signalling.md) + * [Available Crate Data](/Docs/ForDevelopers/CrateSignalling.md) +* [ActivityTemplates](/Docs/ForDevelopers/Objects/ActivityTemplates.md) +* [Documentation](/Docs/ForDevelopers/ActivityDevelopmentBuildingDocumentation.md) +* [Categorization](/Docs/ForDevelopers/Objects/Activities/ActivityCategories.md) +* [Tagging](/Docs/ForDevelopers/OperatingConcepts/Tagging.md) ### Advanced Concepts -[Activity Branching](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Branching.md) -[Loop](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/Activities/Loop.md) -[Views](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/ActivitiesViews.md) +[Activity Branching](/Docs/ForDevelopers/Branching.md) + +[Loop](/Docs/ForDevelopers/Objects/Activities/Loop.md) +[Views](/Docs/ForDevelopers/ActivitiesViews.md) -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) diff --git a/Docs/ForDevelopers/Objects/Activities/ActivityCategories.md b/Docs/ForDevelopers/Objects/Activities/ActivityCategories.md new file mode 100644 index 0000000000..39a9e8b486 --- /dev/null +++ b/Docs/ForDevelopers/Objects/Activities/ActivityCategories.md @@ -0,0 +1,40 @@ +Activity Categories +=================== + +Categories are applied to an ActivityTemplate like tags. The Activity designer can specify as many categories as make sense. + +Categories are exposed to the user: +1) as selectable choices in the main Activity Chooser UI in the client +2) as static Category Pages that are generated to provide a focus page for a category. + +Category Example: Web Service +---------------------------- + +The most important Category is usually the associated Web Service. For example, if you create an Activity that works with DocuSign, you should add the "DocuSign" Category to its [ActivityTemplate](/Docs/ForDevelopers/Objects/ActivityTemplates.md) so it shows up grouped with the other DocuSign Activities. + +Category Example: The Main Buckets +---------------------------------- + +Activity Designers are encouraged to categorize their Activity into one of the four "Main Buckets": + +Category | Description | JSON sample +--- | --- | --- +Triggers | Activities that wait for an external event notification to arrive | { "iconPath": "/Content/icons/monitor-icon-64x64.png", "name": "Triggers" } +Get Data | Also known as “Getters”. Activities that attempt to load or acquire a piece of data from an external source | { "iconPath": "/Content/icons/get-icon-64x64.png", "name": "Get Data" } +Processors | Activities that focus on processing and transforming Container data at run-time. They are not forbidden from connecting to external sources, but they’re encouraged to focus on carrying out a single transform of the payload data | { "iconPath": "/Content/icons/process-icon-64x64.png", "name": "Process Data" } +Ship Data | Activities that push or send data to an external service or another Fr8 Container/Plan | { "iconPath": "/Content/icons/forward-icon-64x64.png", "name": "Ship Data" } + +It is possible to specify more than one Category for single Activity. + + +Specifying Categories +---------------------- +The Categories field in the ActivityTemplate specifies a list of Activity Categories to which current Activity belongs to. + +1) Determine what the useful categories are to attach to your Activity +2) If they already exist in our Category Registry (UPDATE WITH LINK), your Activity Template should simply reference them either by their name or their id, using the existing categories element, but populating it with simple key value pairs: +"categories" : [ + "id" : "3", + "name" : "Forwarders" +] + diff --git a/Docs/ForDevelopers/Objects/Activities/Controls.md b/Docs/ForDevelopers/Objects/Activities/Controls.md index dab3e06285..4bd46f5d3e 100644 --- a/Docs/ForDevelopers/Objects/Activities/Controls.md +++ b/Docs/ForDevelopers/Objects/Activities/Controls.md @@ -1,7 +1,14 @@ -#Control Objects -Some terminal activities require interaction with users at both design-time and runtime. In order to facilitate this interaction, several "control" classes are defined. These classes are serialized to JSON then sent over HTTP as payload data in a [Crate](https://github.com/Fr8org/Fr8Core/tree/master/Docs/ForDevelopers/OperatingConceptsk/Crates.md). In the Plan Builder interface the JSON data is translated by the Hub in to typical HTML elements such as select drop down lists, text fields, and radio buttons. +#UI Controls -This document outlines the available controls. it is important to note that all controls extend the [ControlDefinitionDTO](../DataTransfer/ControlDefinitinDTO.md) and have access to the properties defined by the parent class, including events. +Fr8's UI philosophy is that Activity designers should be able to tap a rich set of UI controls for purpose of passing information to users and collecting configuration information from users, but should never have to think about layout or FE issues. So we emulated the basic idea of HTML (declare the UI you want in more-or-less English) and created a mechanism for the settings input by the user to be passed back to the Activity when it needs them. + +Like the rest of Fr8 UI structures are defined in JSON and passed around in [Crates](/Docs/ForDevelopers/OperatingConceptsk/Crates.md). UI Controls Crates are added to the Crate Storage of Activities. The Client parses the data and renders the appropriate structures on screen, and when users type in or select values, those are saved into the same Crates. + +In practice, Activity designers aren't expected to want to engage in actual JSON manipulation, so one of the core services provided by the growing set of [Fr8 Platform SDK's](/Docs/ForDevelopers/SDKHome.md) is a set of UI classes that can be used in native code and handle the JSON quietly in the background. + +As a result, the JSON docs here are a useful reference, but you'll want to look at your SDK and at examples of existing Activity code to see the best practices for your particular platform. + +Note that all controls extend the [ControlDefinitionDTO](../DataTransfer/ControlDefinitinDTO.md) base set. ##Controls *[BuildMessageAppender](Controls/BuildMessageAppender.md)* diff --git a/Docs/ForDevelopers/Objects/Activities/Signalling.md b/Docs/ForDevelopers/Objects/Activities/Signalling.md index 6ecf140d52..4bf73c4947 100644 --- a/Docs/ForDevelopers/Objects/Activities/Signalling.md +++ b/Docs/ForDevelopers/Objects/Activities/Signalling.md @@ -1,12 +1,12 @@ -# ACTIVITIES – SIGNALLING STATUS -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +# ACTIVITIES – SIGNALING +[Go to Contents](/Docs/Home.md) Activities signal information in several ways: 1. They signal the UI they want shown to users by configuring a Crate of UI Controls and addit it to the Activity JSON. -2. At Run-time, they signal their preferred flow control by providing [Activity Responses](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/Activities/ActivityResponses.md) in their HTTP responses. These can have dramatic effects like shutting down the entire Plan. -3. At Design-time, they [signal the Crates and Fields that they intend to make available at Run-Time](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/CrateSignalling.md), so that downstream Activities can respond (for example, by enabling mapping from one field to another). +2. At Run-time, they signal their preferred flow control by providing [Activity Responses](/Docs/ForDevelopers/Objects/Activities/ActivityResponses.md) in their HTTP responses. These can have dramatic effects like shutting down the entire Plan. +3. At Design-time, they [signal the Crates and Fields that they intend to make available at Run-Time](/Docs/ForDevelopers/OperatingConcepts/Signaling.md), so that downstream Activities can respond (for example, by enabling mapping from one field to another). -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) diff --git a/Docs/ForDevelopers/Objects/ActivityTemplates.md b/Docs/ForDevelopers/Objects/ActivityTemplates.md index 472f000b41..3f6319a304 100644 --- a/Docs/ForDevelopers/Objects/ActivityTemplates.md +++ b/Docs/ForDevelopers/Objects/ActivityTemplates.md @@ -57,22 +57,7 @@ Activity template version ##### categories -Categories field specifies a list of Activity Categories to which current Activity belongs to. - -By default, following four categories are available: -Category | Description | JSON sample ---- | --- | --- -Monitors | Activities that wait for an external event notification to arrive | { "iconPath": "/Content/icons/monitor-icon-64x64.png", "name": "Monitor" } -Receivers | Also known as “Getters”. Activities that attempt to load or acquire a piece of data from an external source | { "iconPath": "/Content/icons/get-icon-64x64.png", "name": "Get" } -Processors | Activities that focus on processing and transforming Container data at run-time. They are not forbidden from connecting to external sources, but they’re encouraged to focus on carrying out a single transform of the payload data | { "iconPath": "/Content/icons/process-icon-64x64.png", "name": "Process" } -Senders | Activities that push or send data to an external service or another Fr8 Container/Plan | { "iconPath": "/Content/icons/forward-icon-64x64.png", "name": "Forward" } - -However, it is possible to specify more than one Category for single Activity. - -##### webService - -WebService shows us which external service does this activity belongs to. -Please note, this attribute might get replaced with "categories" attribute in nearest future. +See [Activity Categories](/Docs/ForDevelopers/Objects/Activities) ##### terminal diff --git a/Docs/ForDevelopers/Objects/Objects.md b/Docs/ForDevelopers/Objects/Objects.md index 97192addd7..694d41acde 100644 --- a/Docs/ForDevelopers/Objects/Objects.md +++ b/Docs/ForDevelopers/Objects/Objects.md @@ -7,10 +7,9 @@ * [Activity Templates](ActivityTemplates.md) * [Crates](/Docs/ForDevelopers/Objects/Crate.md) * [Hubs](Fr8Hubs.md) -* [Plans](Plans.md) -* [Plan Nodes](PlanNodes.md) -* [Plan Templates](Plans/PlanTemplates.md) -* [Subplans](Subplans.md) +* [Plans](Plans/Plans.md) +* [Plan Nodes](Plans/PlanNodes.md) +* [Subplans](Plans/Subplans.md) * [Containers](Containers.md) * [Container Execution](ContainerExecution.md) * [Terminals](Terminals.md) diff --git a/Docs/ForDevelopers/Objects/PlanJSONDefinition.md b/Docs/ForDevelopers/Objects/PlanJSONDefinition.md deleted file mode 100644 index f34591a12b..0000000000 --- a/Docs/ForDevelopers/Objects/PlanJSONDefinition.md +++ /dev/null @@ -1,34 +0,0 @@ -# PLAN – JSON DEFINITION -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) - -The JSON specification for a Plan is: -```javascript -{ - "subplans": [ - { - "activities": [ - {}, - {} - ], - "id": "e9e89349-3871-46e4-ad11-71e9e207a9f3", - "planId": "91d3d82e-f471-4095-bd59-9f88ea86d5af", - "name": null, - "transitionKey": null - } - ], - "fr8UserId": "fcc7d694-4820-4d04-bc83-67251fcf8a15", - "id": "91d3d82e-f471-4095-bd59-9f88ea86d5af", - "name": "MonitorAllDocuSignEvents", - "tag": "docusign-auto-monitor-plan-fcc7d694-4820-4d04-bc83-67251fcf8a15", - "visibility": {"hidden": false, "public": false}, - "description": "MonitorAllDocuSignEvents", - "lastUpdated": "0001-01-01T00:00:00+00:00", - "planState": 2, - "startingSubrouteId": "e9e89349-3871-46e4-ad11-71e9e207a9f3" -} -``` -## Visibility - -This property is optional and consist of object with two boolean properties: "hidden" and "public". Default is {"hidden": false, "public": false}, "hidden" corresponds to Plan's visibility for user, false is “Standard” visibility. Plans with "hidden": false, “Internal” visibility are not generally displayed to their owning users. An example would be the Plan that registers for and records DocuSign Events when a Fr8 User has linked in a DocuSign account. Property "public" shows whether Plan is published in PlanDirectory, "public": true, means that Plan is published. - -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) diff --git a/Docs/ForDevelopers/Objects/Plans/MovingPlans.md b/Docs/ForDevelopers/Objects/Plans/MovingPlans.md index 2b277f77bf..86acf15789 100644 --- a/Docs/ForDevelopers/Objects/Plans/MovingPlans.md +++ b/Docs/ForDevelopers/Objects/Plans/MovingPlans.md @@ -1,12 +1,33 @@ Moving and Sharing Plans ======================== -Plan JSON is designed to be portable. You can download it and then upload it into a different Hub, and it should work. +[Plan JSON](/Docs/ForDevelopers/Objects/Plans/PlanJSONDefinition.md) is designed to be portable. You can download it and then upload it into a different Hub, and it should work. -Plans can be downloaded from the Plan Details page (reachable from [here](https://fr8.co/dashboard/myaccount)). -When a Plan is downloaded, the following things happen: +There are few ways to download the plan: -To upload a Plan, do this: +### Using plan details page +1. On this page (reachable from [here](https://fr8.co/dashboard/myaccount)) click on *Settings* button: +![Plan settings button](/Docs/img/MovePlans.PlanSettingsButton.png) +2. Click *Download* button in the page that will open: +![Plan settings button]/Docs/img/MovePlans.DownloadPlanButton.png) +Plan JSON will be downloaded as the file by your browser. -You can also share a Plan with others by publishing it to the [Plan Directory](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/OperatingConcepts/PlanDirectory.md). + + +### Using plan builder + +You can open plan details page directly from the Plan Builder: +![Plan settings button](/Docs/img/MovePlans.PBPlanSettings.png) + + +## Uploading the plan + +To upload the plan click on *Load from JSON file* under *Plans* menu group: +![Upload plan](/Docs/img/MovePlans.UploadPlanButton.png) + +Enter the name that the plan being uploaded will have and select the file with the plan JSON that was previously downloaded: +![Upload plan](/Docs/img/MovePlans.UploadPlanWindow.png) + + +You can also share a Plan with others by publishing it to the [Plan Directory](/Docs/ForDevelopers/OperatingConcepts/PlanDirectory.md). diff --git a/Docs/ForDevelopers/Objects/Plans/PlanJSONDefinition.md b/Docs/ForDevelopers/Objects/Plans/PlanJSONDefinition.md new file mode 100644 index 0000000000..a757397c25 --- /dev/null +++ b/Docs/ForDevelopers/Objects/Plans/PlanJSONDefinition.md @@ -0,0 +1,155 @@ +# PLAN – JSON DEFINITION +[Go to Contents](/Docs/Home.md) + +In Fr8 plans are represented in the form of JSON. Lets looks at the following plan: + +![plan with loop](/Docs/img/PlanExecution-PlanWithLoop.png) + + +The JSON representation of this plan is: +```javascript +{ + "subPlans": [ + { + "activities": [ + { + "label": null, + "name": "Get Google Sheet Data", + "activityTemplate": { + "name": "Get_Google_Sheet_Data", + "version": "1", + "terminalName": "terminalGoogle", + "terminalVersion": "1" + }, + "planId": "5c1499ce-4b21-4ca3-ab81-6924e0d55a84", + "parentPlanNodeId": "e26e374e-2691-4625-89fe-79d5200b4e89", + "currentView": null, + "ordering": 1, + "id": "28b93b3d-1abe-4443-aa1d-5bfa15365e3e", + "crateStorage": { + ... Content is omitted for clarity ... + }, + "childrenActivities": [], + "authTokenId": "4e58046e-efb9-4a43-ad93-4a98ad9cc1c0", + "authToken": null, + "documentation": null + }, + { + "label": null, + "name": "Loop", + "activityTemplate": { + "name": "Loop", + "version": "1", + "terminalName": "terminalFr8Core", + "terminalVersion": "1" + }, + "planId": "5c1499ce-4b21-4ca3-ab81-6924e0d55a84", + "parentPlanNodeId": "e26e374e-2691-4625-89fe-79d5200b4e89", + "currentView": null, + "ordering": 2, + "id": "e81fade0-5332-416c-9da1-31a322a70f05", + "crateStorage": { + ... Content is omitted for clarity ... + ] + }, + "childrenActivities": [ + { + "label": null, + "name": "Publish To Slack", + "activityTemplate": { + "name": "Publish_To_Slack", + "version": "2", + "terminalName": "terminalSlack", + "terminalVersion": "1" + }, + "planId": "5c1499ce-4b21-4ca3-ab81-6924e0d55a84", + "parentPlanNodeId": "e81fade0-5332-416c-9da1-31a322a70f05", + "currentView": null, + "ordering": 1, + "id": "9ad788eb-6ca0-42ee-888d-242d6971d7d8", + "crateStorage": { + ... Content is omitted for clarity ... + }, + "childrenActivities": [], + "authTokenId": "c8c69cc4-97a1-4787-ac69-1dcc8b9cb083", + "authToken": null, + "documentation": null + } + ], + "authTokenId": null, + "authToken": null, + "documentation": null + } + ], + "id": "e26e374e-2691-4625-89fe-79d5200b4e89", + "planId": "5c1499ce-4b21-4ca3-ab81-6924e0d55a84", + "parentPlanNodeId": null, + "name": "Starting Subplan" + } + ], + "ownerId": "fbb00d37-5c03-4296-9569-a32aeab70443", + "id": "5c1499ce-4b21-4ca3-ab81-6924e0d55a84", + "name": "Plan with loops", + "tag": null, + "description": null, + "lastUpdated": "2016-08-02T19:52:46.2268865+00:00", + "planState": "Inactive", + "startingSubPlanId": "e26e374e-2691-4625-89fe-79d5200b4e89", + "visibility": { + "hidden": false, + "public": false + }, + "category": null +} +``` + +## Plan node JSON +Describes properties of the [plan](/Docs/ForDevelopers/Objects/Plans/Plans.md) itself. +* **subPlans** - one or more subplans. Each plan must have at least one subplan. +* **ownerId** - Id of the owner user +* **id** - Id of the plan. +* **name** - Name of the plan. Value of this property is shown in the UI. +* **description** - Optional free form text, describing what this plan is doing. +* **lastUpdated** - Last time this plan was changed +* **startingSubPlanId** - Identifier of the subplan, activities of which will be executed when the user requests the plan execution. +* **planState** - state of the plan. Can be: + * **Inactive**. Plan is created, but it is not being executed right now + * **Running**. Plan is being executed. + * **Active**. This is monitoring plan and this plan has been sucessfully activated. Now it is waiting for trigger event to start execution. + * **Deleted**. Plan was deleted. In Fr8, when user deletes the plan its content stays in the DB untouched. The only thing changes is the plan state. Fr8 marks such plan as deleted and stops displaying and processing it. + +### Visibility + +This property is optional and consist of object with two boolean properties: **hidden** and **public**. Default is: +```javascript +{ + "hidden": false, + "public": false +} +``` + +* **hidden** corresponds to Plan's visibility for user: + * **false** is “Standard” visibility. Plan is shown in the UI. + * **true** is “Internal” visibility. Such plans are not generally displayed to their owning users. An example would be the Plan that registers for and records DocuSign Events when a Fr8 User has linked in a DocuSign account +* **public** shows whether Plan is published in **PlanDirectory**. If **true** then the plan is published, othewise - **false**. + +## Subplan JSON +Describes properties of a [subplan](/Docs/ForDevelopers/Objects/Plans/Subplans.md). +* **activities** - list of activities. +* **id** - identifier of the subplan +* **planId** - identifier of the plan this subplan belongs to. +* **name** - name of the subplan. + +## Activity JSON +Describes properties of an [activity](/Docs/ForDevelopers/Objects/Activities.md) +* **name** - name of the activity. This property is displayed to a user +* **activityTemplate** - [Activity Template](/Docs/ForDevelopers/Objects/ActivityTemplates.md). +* **id** - Identifier of the activity +* **planId** - identifier of the plan this activitiy belongs to. +* **parentPlanNodeId** - identifier of the parent node this activity belongs to. This can be the Id of the subplan or Id of other activity. +* **ordering** - activities within the common parent are being displayed and executed in the order that is defined by this property +* **crateStorage** - [Crate Storage](/Docs/ForDevelopers/Objects/DataTransfer/CrateStorageDTO.md) where activity configuration is stored. +* **authTokenId** - identifier of the authentication token +* **childrenActivities** - list of children activities. + +[Go to Contents](/Docs/Home.md) diff --git a/Docs/ForDevelopers/Objects/PlanNodes.md b/Docs/ForDevelopers/Objects/Plans/PlanNodes.md similarity index 100% rename from Docs/ForDevelopers/Objects/PlanNodes.md rename to Docs/ForDevelopers/Objects/Plans/PlanNodes.md diff --git a/Docs/ForDevelopers/Objects/Plans.md b/Docs/ForDevelopers/Objects/Plans/Plans.md similarity index 61% rename from Docs/ForDevelopers/Objects/Plans.md rename to Docs/ForDevelopers/Objects/Plans/Plans.md index 3624c978be..a58b96db22 100644 --- a/Docs/ForDevelopers/Objects/Plans.md +++ b/Docs/ForDevelopers/Objects/Plans/Plans.md @@ -1,5 +1,5 @@ # Plans -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) A Fr8 Plan is a JSON element that defines a series of Activities. It may have one or more Subplans. When a Plan is run, a Fr8 Hubs first generates a Payload Container, which is a JSON structure designed to store any data generated during the execution of the Plan. The Hub then identifies the Terminal responsible for the starting Activity, and posts the Payload Container off to it. @@ -22,17 +22,17 @@ If you're developing a Terminal, you don't really worry about Plans. You're most Flow Control ------------ -Fr8 provides a powerful set of [flow control](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/Activities/ActivityResponses.md) tools that can be integrated into Plans. +Fr8 provides a powerful set of [flow control](/Docs/ForDevelopers/Objects/Activities/ActivityResponses.md) tools that can be integrated into Plans. Additional Resources -------------------- -[The Plan JSON Definition](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/PlanJSONDefinition.md) -[Activating & Running Plans](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/PlansActivationAndRunning.md) -[Moving and Sharing Plans](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/Objects/Plans/MovingPlans.md) +[The Plan JSON Definition](/Docs/ForDevelopers/Objects/Plans/PlanJSONDefinition.md) +[Activating & Running Plans](/Docs/ForDevelopers/Objects/PlansActivationAndRunning.md) +[Moving and Sharing Plans](/Docs/ForDevelopers/Objects/Plans/MovingPlans.md) -[Plan Execution](https://github.com/Fr8org/Fr8Core/blob/master/Docs/ForDevelopers/OperatingConcepts/PlanExecution.md) +[Plan Execution](/Docs/ForDevelopers/OperatingConcepts/PlanExecution.md) -[Go to Home](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Home](/Docs/Home.md) diff --git a/Docs/ForDevelopers/Objects/Subplans.md b/Docs/ForDevelopers/Objects/Plans/Subplans.md similarity index 100% rename from Docs/ForDevelopers/Objects/Subplans.md rename to Docs/ForDevelopers/Objects/Plans/Subplans.md diff --git a/Docs/ForDevelopers/OperatingConcepts/ActivitiesValidation.md b/Docs/ForDevelopers/OperatingConcepts/ActivitiesValidation.md index efdf451912..d96458a279 100644 --- a/Docs/ForDevelopers/OperatingConcepts/ActivitiesValidation.md +++ b/Docs/ForDevelopers/OperatingConcepts/ActivitiesValidation.md @@ -1,26 +1,148 @@ # Validation -[Go to Contents](https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md) +[Go to Contents](/Docs/Home.md) + ## Summary -Every time when Hub configures activity or activates it prior to running a plan which results in respective calls to terminal's `activities\configure` and `activities\activate` endpoints, activity gets a chance to report Hub any validation errors it has. -Hub parses the crate list returned by activity and looks for `ValidationResultCM` manifest. If it founds one it checks for its `validationErrors` property value. If this value contains at least one error message then Hub marks related activity UI controls with specified error messages and in case of `activities\activate` method it stops further processing thus plan doesn't move to `Active` status and its activities don't get executed. +Every time when Hub configures activity or activates it prior to running a plan which results in respective calls to terminal's `activities\configure` and `activities\activate` endpoints, activity gets a chance to report Hub any validation errors it has. + +Information about validation errors are represented in the form of **ValidationResultCM** crate. If activity wants to report about any validation errors it should place **ValidationResultCM** crate in the activity crate storage. While processing `activities\configure` or `activities\activate` responses the Hub will check for presence of **ValidationResultCM** crate. If this crate is found the Hub will instruct the client to display validation errors in the UI. In addition, if validation errors are returned within `activities\activate` response the Hub will stop related plan activation that effectively prevents faulty plan to execute. See more about plan activation and execution [here](/Docs/ForDevelopers/Objects/PlansActivationAndRunning.md). + ## ValidationResultCM manifest structure -More information on what is manifest can be found [here](http://documentation.fr8.co/developers/objects/crates-manifest/) -Below is the sample contents of `ValidationResultCM` manifest +Fr8 supports several types of validation errors: +* **Control** - errors that are related to the certain control's value +* **Multi-controls** - errors spanning for several controls at time (cross-checks between controls value) +* **Activity wide** - error that are related to the entire activity in its current state + +Any number of errors of any type and in any combinations can be reported using **ValidationResultCM**. Here is an example content of **ValidationResultCM**: - { +```javascript + { "validationErrors":[ { "controlNames":[ - "TemplateSelector" + "Control1", + "Control2" ], - "errorMessage":"Template was not selected" + "errorMessage":"Multi-controls validation message" + }, + { + "controlNames":[ + "Control3" + ], + "errorMessage":"Control validation message" + }, + { + "controlNames":[], + "errorMessage":"Activity wide validation message" } ] } - - -## Validate Method in Activity Classes - The Validate method in Activity classes gets called upon every followup /configure call - unless *DisableValidationOnFollowup* variable setted up to *true* inside Activity constructor. +``` +**validationErrors** array contains one or more validation errors. Each validation error is represented by the JSON with the following properties: +* **errorMessage** - error message that will be displayed to the user. +* **controlNames** - the list of controls names which values are responsible for the validation error. Control names should be exactly the same that are used in **Configuration Controls** crate. + * If this array contains the only element then the error is considered to be **Control** error. + * If this array contains more then one element the error is considered to be **Multi-controls** error. + * If this array contains no elements then the error is considered to be **Activity wide** error. + +## Example usages + +### Control error +Lets see practical example of how validation error is reported and displayed in *Publish to Slack* activity when no Message to publish was set: + +![ControlError](/Docs/img/Validation.ControlError.png) + +And here is how this activity crate storage looks like (unrelated properties are omitted for clarity): +```javascript +{ + "crates": [ + { + "manifestType": "Standard UI Controls", + "manifestId": 6, + "manufacturer": null, + "manifestRegistrar": "www.fr8.co/registry", + "id": "10af10ae-d369-4503-82e2-dd17c19869d0", + "label": "Configuration_Controls", + "contents": { + "Controls": [ + { + "name": "DropDownList0", + "type": "DropDownList", + "value": "C07JDTU82", + "label": "Select Slack Channel", + }, + { + "name": "MessageSource", + "type": "TextSource", + "upstreamSourceLabel": null, + "textValue": null, + "valueSource": "specific", + } + ] + }, + "parentCrateId": null, + "createTime": "", + "sourceActivityId": null + }, + { + "manifestType": "Validation Results", + "manifestId": 39, + "manufacturer": null, + "manifestRegistrar": "www.fr8.co/registry", + "id": "a230e4ec-1db5-43c1-8553-eb4a637be05d", + "label": "Validation Results", + "contents": { + "validationErrors": [ + { + "controlNames": [ + "MessageSource" + ], + "errorMessage": "Can't post empty message to Slack" + } + ] + }, + "parentCrateId": null, + "createTime": "", + "sourceActivityId": null + } + ] +} +``` + +## Dealing with upstream values + +It is important to remember that some controls, like **TextSource** can has two possible sources of value: +* Explicit value that was typed by a user +* Upstream value - information (crate label, field key, etc) that tells how to resolve the value from the container crate storage during execution. + +Validation logic should take care of these two possible cases. In case of upstream value source the only thing that can be validated is the fact that some information about run-time value resolution has been set. You can't validate the value itself, because it is not available during the design time. Lets see how it looks like: + +Here is an example of the TextSource that has explicit value set (unrelated properties are omitted for clarity): +```javascript +{ + "selectedItem": null, + "textValue": "Explicit value", + "valueSource": "specific" +} +``` + +Note that **textValue** is not empty and contains the value that was typed by the user and **valueSource** has value "specific". + +Here is an example of the TextSource that has upstream value set (unrelated properties are omitted for clarity): +```javascript +{ + "textValue": null, + "valueSource": "upstream", + "selectedItem": { + "key": "text", + "label": "text", + "fieldType": null, + "isRequired": false, + "availability": 2, + "sourceCrateLabel": "Slack Message", + "sourceActivityId": "57ab1ae4-83b9-42d0-b0dd-c9db1986e144" + } +} +``` +Note that **textValue** is empty but **valueSource** has value "upstream" and **selectedItem** contains information about the upstream. \ No newline at end of file diff --git a/Docs/ForDevelopers/OperatingConcepts/Authorization/Home.md b/Docs/ForDevelopers/OperatingConcepts/Authorization/Home.md index c96ede2941..83b4f30d05 100644 --- a/Docs/ForDevelopers/OperatingConcepts/Authorization/Home.md +++ b/Docs/ForDevelopers/OperatingConcepts/Authorization/Home.md @@ -8,7 +8,7 @@ Operational Security [Authorization and Authentication Overview](./AuthOverview.md) -[Fr8's OAuth Mechanisms](/Docs/ForDevelopers/OperatingConcepts/Authorization/Home.md) +[Fr8's OAuth Mechanisms](/Docs/ForDevelopers/DevelopmentGuides/Terminals/dotNet/TerminalDeveloping-Authentication.md) [Terminal Authentication (How the Terminals identify themselves to the Hubs)](/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md) diff --git a/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md b/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md index 2b75bdc36f..b165b7c4dc 100644 --- a/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md +++ b/Docs/ForDevelopers/OperatingConcepts/Authorization/TerminalAuthentication.md @@ -1,15 +1,3 @@ Terminal Authentication ======================= - -Vladimir says I need to create a unique Id for every discovery request from every other Hub. - -[2:36] -And if a force discovery is made, I need to return this Id again. - -[2:36] -This was one of the problems with the previous implementation. - -[2:36] -Currently, it returns an unique ID every time. - diff --git a/Docs/ForDevelopers/OperatingConcepts/Tagging.md b/Docs/ForDevelopers/OperatingConcepts/Tagging.md index da4d058608..92a9bc6434 100644 --- a/Docs/ForDevelopers/OperatingConcepts/Tagging.md +++ b/Docs/ForDevelopers/OperatingConcepts/Tagging.md @@ -1,49 +1,30 @@ -Tagging and Categorization +Tagging =========================== -We anticipate there will be a lot of different Terminals, Plans and Activities, so we've implemented tools to enable designers to assign categories to their creations. +We anticipate there will be a lot of different Terminals, Plans and Activities, so we've implemented tools to enable designers to assign tags and categories to their creations. -These categories are used in a couple of ways: -1) when users browse Activities, to help them sort through the available choices -2) by the Hub, when an Activity seeks a list of all of the Activities meeting certain criteria +Categories are used to visually bucket Activities into useful semantic groups like "Triggers", "Math Tools", and "DocuSign Activities". Categories are discussed [here.](/Docs/ForDevelopers/Objects/Activities/ActivityCategories.md) -To apply a Category to an Activity, Plan, or Terminal, add a key value pair [VERIFY THIS] to its Tags property in its JSON definition. +Tags are used for less visible marking and grouping of Activities. Tags that are currently defined and used by the system include: + . -Applying these Category Tags is optional. Doing so may increase the number of views that feature your Activity, Plan or Terminal. -Some Activities specify drop down list boxes and ask the Hub to provide a list filtered on a particular Category. For example, this activity -has requested that the Hub provide it with a set of all of the Activities that are categorized as Notifier (See Below): - -![](notifiertag.png) +### Notifier -Defined Categories ------------------- - -### GeneralActivityType -This bins Activities into one of four main types of activity. - -Category | Description ---- | --- -Triggers | Activities that wait for an external event notification to arrive -Receivers | Also known as “Getters”. Activities that attempt to load or acquire a piece of data from an external source -Processors | Activities that focus on processing and transforming Container data at run-time. They are not forbidden from connecting to external sources, but they’re encouraged to focus on carrying out a single transform of the payload data -Forwarders | Activities that push or send data to an external service or another Fr8 Container/Plan - +Marks an Activity as being useful for notifying someone of an event. A typical list might include SMS, Email, HipChat, Slack. An Activity using this Tag should have, as its primary function, a mechanism to notify a user of an event. -### Notifier +Some Activities specify drop down list boxes and ask the Hub to provide a list filtered on a particular Category. For example, this activity +has requested that the Hub provide it with a set of all of the Activities that are categorized as Notifier (See Below): -See above. Marks an Activity as being useful for notifying someone of an event. A typical list might include SMS, Email, HipChat, Slack. An Activity using this Tag should have, as its primary function, a mechanism to notify a user of an event. +![](notifiertag.png) + ### Table Data Generator Indicates that an activity generates table data. Used by other activities to query for all activities that generate tables. - -AggressiveReload [INVESTIGATE. STILL IN USE?] -If present, then each time the client receives a response from a configure call for another action, it will call this activity’s configure action again. Should be used sparingly. In general, well-designed activities do not require this. - [Home](/Docs/Home.md) diff --git a/Docs/ForDevelopers/SDK/.NET/Home.md b/Docs/ForDevelopers/SDK/.NET/Home.md index 3d54f475ef..731579e37c 100644 --- a/Docs/ForDevelopers/SDK/.NET/Home.md +++ b/Docs/ForDevelopers/SDK/.NET/Home.md @@ -14,6 +14,8 @@ Additional Topics ----------------- +[Validation](/Docs/ForDevelopers/SDK/.NET/Validation.md) + [Crate Manager](/Docs/ForDevelopers/SDK/.NET/Services/Crate%20Manager.md) [Supporting OAuth](/Docs/ForDevelopers/DevelopmentGuides/Terminals/dotNet/TerminalDeveloping-Authentication.md) diff --git a/Docs/ForDevelopers/SDK/.NET/Validation.md b/Docs/ForDevelopers/SDK/.NET/Validation.md new file mode 100644 index 0000000000..4b9d4810b3 --- /dev/null +++ b/Docs/ForDevelopers/SDK/.NET/Validation.md @@ -0,0 +1,89 @@ +# Validation + +See [here](/Docs/ForDevelopers/OperatingConcepts/ActivitiesValidation.md) for general information about validation. + +In .NET SDK validation if performed by [ValidationManager](/Docs/ForDevelopers/SDK/.NET/Reference/ValidationManager.md) service that is accessible from **Validate** method in any activity derived from [TerminalActivityBase](/Docs/ForDevelopers/SDK/.NET/Reference/TerminalActivityBase.md). + +To implement validation logic you have to override **Validate** method. Default implementation in the .NET SDK base classes is empty so you don't have to invoke it in the overridden method. + +Here is how typical implementation of validation logic looks like: +```c# +protected override Task Validate() +{ + if (string.IsNullOrEmpty(ActivityUI.ChannelSelector.Value)) + { + ValidationManager.SetError("Channel or user is not specified", ActivityUI.ChannelSelector); + } + + ValidationManager.ValidateTextSourceNotEmpty(ActivityUI.MessageSource, "Can't post empty message to Slack"); + + return Task.FromResult(0); +} +``` + +In .NET SDK validation code is invoked not only during processing of */configure* and */activate* requests, but also before activity execution. In case of errors, activity execution will be terminated and the error will be returned to the Hub. The error text is composed from validation error messages in the human readable form. Such approach allows you to have one common place with validation logic. + +> **Important!** +> Never duplicate validation logic inside the **Run** method. + +## Dealing with upstream values + +Some UI controls can be configured by the user to use values from upstream instead of explicit values. It is important to correctly handle such cases. For example, if you want to check if the *TextSource* has a valid e-mail value you can't just write: +```c# +protected override Task Validate() +{ + if (ValidateEMail(ActivityUI.EMail.TextValue)) + { + ValidationManager.SetError("Invalid e-mail", ActivityUI.EMail); + } + + return Task.FromResult(0); +} +``` + +because if *ActivityUI.MessageSource* is configured to use upstream value then *TextValue* will be empty during the design-time and you will generate false validation error. You should write a bit more complex logic instead: +```c# +protected override Task Validate() +{ + if (!ActivityUI.EMail.HasUpstreamValue && ValidateEMail(ActivityUI.EMail.TextValue)) + { + ValidationManager.SetError("Invalid e-mail", ActivityUI.EMail); + } + + return Task.FromResult(0); +} +``` +Here we will throw validation error only if there is no upstream value set and *TextValue* is not a valid e-mail. + + +## Dealing with run-time +You may wonder how our validation check will work during the run-time in case of upstream value source: *ActivityUI.EMail.HasUpstreamValue* is true, so *ValidateEMail* will not be called, and even if is called somehow then *TextValue* is empty and the check will fail. The answer is simple. During the run-time the Hub will extract actual value from the payload and assign this value to *TextValue* and reconfigure this TextSource control as if is using explicit value. In other words, your activity will think that *TextSource* was configured to use explicit value. So our validation logic will be executed without any issues in all possible cases. + +> **Important**: +> There is no need to implement any special handling for run-time validation scenario. + +## Extending ValidationManager +In general, if you find that you write the same validation logic again and again in your activities or you want to make validation logic resuable, consider creation of extension method for **ValidationManager**. Here is how our e-mail validation example can be rewritten: + +```c# +public static class MyValidationExtensions +{ + public static void ValidateEmail(this ValidationManager validationManager, TextSource textSource, string errorMessage = null) + { + if (!textSource.HasUpstreamValue && ValidateEMail(textSource.TextValue)) + { + validationManager.SetError(errorMessage ?? "Invalid e-mail", textSource); + } + } +} +``` + + +```c# +protected override Task Validate() +{ + ValidationManager.ValidateEmail (ActivityUI.EMail); + + return Task.FromResult(0); +} +``` \ No newline at end of file diff --git a/Docs/ForDevelopers/Services/Notifications.md b/Docs/ForDevelopers/Services/Notifications.md new file mode 100644 index 0000000000..2525cf12ef --- /dev/null +++ b/Docs/ForDevelopers/Services/Notifications.md @@ -0,0 +1,42 @@ +Notification Services +===================== + +[Go to Contents](/Docs/Home.md) + +Notifications are messages that inform users about ongoing operations. + + +## Details + +The primary mechanism for delivering Notifications is the Activity Stream which is generally inform user about Plan execution phases or messages published by terminals. Notification messages are either displayed in the Activity Stream or with a toast notification. Fr8 User Interface decides which one to use based on user browser. + +![ActivityStream](/Docs/img/ActivityStream.png) + + +## Generating a Notification Message + +Notification messages coming from Terminal requests are classified under "Terminal Event" type and displayed with bolt icon on the screen. They can be generated with this call: + + +*Url* + + {{Fr8HubCallBackUrl}}/api/{{Fr8HubApiVersion}}/notifications + +*Method* + + POST + +*Request Body* +```javascript +{ + "ActivityName" : "App_Builder", + "ActivityVersion": "1", + "Collapsed": false, + "Message": "This is a plan message/description", + "Subject": "This is a custom (optional) header for message", + "TerminalName": "terminalFr8Core", + "TerminalVersion" : "1" +} +``` + +[Go to Contents]( /Docs/Home.md) \ No newline at end of file diff --git a/Docs/ForDevelopers/ServicesHome.md b/Docs/ForDevelopers/ServicesHome.md new file mode 100644 index 0000000000..87024a590b --- /dev/null +++ b/Docs/ForDevelopers/ServicesHome.md @@ -0,0 +1,6 @@ +Fr8 Services +================ + +[Notification](/Docs/ForDevelopers/Services/Notifications.md) + +[Scheduling](/Docs/ForDevelopers/Services/Scheduling.md) diff --git a/Docs/Home.md b/Docs/Home.md index 4857f881c7..f0b7c2ded1 100644 --- a/Docs/Home.md +++ b/Docs/Home.md @@ -1,8 +1,11 @@ #Fr8 for Developers [Part 1 - Introduction](/Docs/ForDevelopers/Introduction.md) -[Part 2 - Understanding the Fr8 Architectural Model](/Docs/ForDevelopers/ArchitecturalModel.md) -[Part 3 - The Fr8 Data Model](/Docs/ForDevelopers/DataModel.md) + +[Part 2 - Understanding the Fr8 Architectural Model](/Docs/ForDevelopers/ArchitecturalModel.md) + +[Part 3 - The Fr8 Data Model](/Docs/ForDevelopers/DataModel.md) + [Part 4 - The Fr8 UI Infrastructure](/Docs/ForDevelopers/OperatingConcepts/UIInfrastructure.md) General Resources @@ -16,14 +19,18 @@ General Resources [Objects](ForDevelopers/Objects/Objects.md) ----------------------------------------- -Specifications - * [Fr8 Hub Specification](/Docs/ForDevelopers/Specifications/Fr8HubSpecification.md) - * [Terminal Specification](/Docs/ForDevelopers/Specifications/TerminalSpecification.md) +API +----------------------------------------- +* [Hub](https://fr8.co/swagger/ui/index) +* [Terminal](http://dev-terminals.fr8.co:25923/swagger/ui/index) +[Services](/Docs/ForDevelopers/ServicesHome.md) +----------------------------------------------- + [Development Guides](ForDevelopers/DevGuideHome.md) ----------------------------- -[Platform SDKs (.NET, Java, Ruby, Python](ForDevelopers/SDKHome.md) +[Platform SDKs (.NET, Java, Ruby, Python)](ForDevelopers/SDKHome.md) ---------------------------------- [Roadmap](/Docs/Roadmap) diff --git a/Docs/img/ActivityDevelopment_DocumentationFlow.png b/Docs/img/ActivityDevelopment_DocumentationFlow.png index 55bd7aa68f..28473ed187 100644 Binary files a/Docs/img/ActivityDevelopment_DocumentationFlow.png and b/Docs/img/ActivityDevelopment_DocumentationFlow.png differ diff --git a/Docs/img/ActivityStream.png b/Docs/img/ActivityStream.png new file mode 100644 index 0000000000..47d068ff5f Binary files /dev/null and b/Docs/img/ActivityStream.png differ diff --git a/Docs/img/MovePlans.DownloadPlanButton.png b/Docs/img/MovePlans.DownloadPlanButton.png new file mode 100644 index 0000000000..2d62cd59b3 Binary files /dev/null and b/Docs/img/MovePlans.DownloadPlanButton.png differ diff --git a/Docs/img/MovePlans.PBPlanSettings.png b/Docs/img/MovePlans.PBPlanSettings.png new file mode 100644 index 0000000000..cc4cf4e800 Binary files /dev/null and b/Docs/img/MovePlans.PBPlanSettings.png differ diff --git a/Docs/img/MovePlans.PlanSettingsButton.png b/Docs/img/MovePlans.PlanSettingsButton.png new file mode 100644 index 0000000000..768703af19 Binary files /dev/null and b/Docs/img/MovePlans.PlanSettingsButton.png differ diff --git a/Docs/img/MovePlans.UploadPlanButton.png b/Docs/img/MovePlans.UploadPlanButton.png new file mode 100644 index 0000000000..3bd613cfe1 Binary files /dev/null and b/Docs/img/MovePlans.UploadPlanButton.png differ diff --git a/Docs/img/MovePlans.UploadPlanWindow.png b/Docs/img/MovePlans.UploadPlanWindow.png new file mode 100644 index 0000000000..84e73ca211 Binary files /dev/null and b/Docs/img/MovePlans.UploadPlanWindow.png differ diff --git a/Docs/img/Validation.ControlError.png b/Docs/img/Validation.ControlError.png new file mode 100644 index 0000000000..9ba57dc145 Binary files /dev/null and b/Docs/img/Validation.ControlError.png differ diff --git a/Documentation/Swagger/DocumentFilters/AddHubDefaultValuesDocumentFilter.cs b/Documentation/Swagger/DocumentFilters/AddHubDefaultValuesDocumentFilter.cs new file mode 100644 index 0000000000..22af8a6efb --- /dev/null +++ b/Documentation/Swagger/DocumentFilters/AddHubDefaultValuesDocumentFilter.cs @@ -0,0 +1,13 @@ +using Fr8.Infrastructure.Documentation.Swagger; + +namespace HubWeb.Documentation.Swagger +{ + //This class will allow to apply sample data for types specific for Hub while still having ability to refer generic sample data + public class AddHubDefaultValuesDocumentFilter : AddDefaultValuesDocumentFilter + { + public AddHubDefaultValuesDocumentFilter() : base() + { + AddDefaultFactoriesFromTypeAssembly(typeof(AddHubDefaultValuesDocumentFilter)); + } + } +} \ No newline at end of file diff --git a/Documentation/Swagger/SampleData/FileDOSampleFactory.cs b/Documentation/Swagger/SampleData/FileDOSampleFactory.cs index 855faed3a5..eb66c69ca5 100644 --- a/Documentation/Swagger/SampleData/FileDOSampleFactory.cs +++ b/Documentation/Swagger/SampleData/FileDOSampleFactory.cs @@ -1,5 +1,6 @@ using System; using Data.Entities; +using Fr8.Infrastructure.Documentation.Swagger; namespace HubWeb.Documentation.Swagger { diff --git a/Documentation/Swagger/SampleData/PlanPostParamsSampleFactory.cs b/Documentation/Swagger/SampleData/PlanPostParamsSampleFactory.cs index f06557c395..d483140393 100644 --- a/Documentation/Swagger/SampleData/PlanPostParamsSampleFactory.cs +++ b/Documentation/Swagger/SampleData/PlanPostParamsSampleFactory.cs @@ -1,4 +1,5 @@ -using HubWeb.ViewModels.RequestParameters; +using Fr8.Infrastructure.Documentation.Swagger; +using HubWeb.ViewModels.RequestParameters; namespace HubWeb.Documentation.Swagger { diff --git a/Documentation/Swagger/SampleData/PlanSampleFactory.cs b/Documentation/Swagger/SampleData/PlanSampleFactory.cs deleted file mode 100644 index 124b2e2962..0000000000 --- a/Documentation/Swagger/SampleData/PlanSampleFactory.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using Fr8.Infrastructure.Data.DataTransferObjects; - -namespace HubWeb.Documentation.Swagger -{ - public class PlanSampleFactory : ISwaggerSampleFactory - { - private readonly ISwaggerSampleFactory _planFullSampleFactory; - - public PlanSampleFactory(ISwaggerSampleFactory planFullSampleFactory) - { - _planFullSampleFactory = planFullSampleFactory; - } - - public PlanDTO GetSampleData() - { - return _planFullSampleFactory.GetSampleData(); - } - - object ISwaggerSampleFactory.GetSampleData() - { - return GetSampleData(); - } - } -} \ No newline at end of file diff --git a/Documentation/Swagger/SampleData/TerminalRegistrationSampleFactory.cs b/Documentation/Swagger/SampleData/TerminalRegistrationSampleFactory.cs deleted file mode 100644 index b4428d1699..0000000000 --- a/Documentation/Swagger/SampleData/TerminalRegistrationSampleFactory.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Fr8.Infrastructure.Data.DataTransferObjects; - -namespace HubWeb.Documentation.Swagger -{ - public class TerminalRegistrationSampleFactory : ISwaggerSampleFactory - { - public TerminalRegistrationDTO GetSampleData() - { - return new TerminalRegistrationDTO - { - Endpoint = "https://terminalfr8Core.fr8.co" - }; - } - - object ISwaggerSampleFactory.GetSampleData() - { - return GetSampleData(); - } - } -} \ No newline at end of file diff --git a/Documentation/Swagger/SampleData/TokenWrapperSampleFactory.cs b/Documentation/Swagger/SampleData/TokenWrapperSampleFactory.cs index 74fee587de..3207ffc36b 100644 --- a/Documentation/Swagger/SampleData/TokenWrapperSampleFactory.cs +++ b/Documentation/Swagger/SampleData/TokenWrapperSampleFactory.cs @@ -1,4 +1,4 @@ -using System; +using Fr8.Infrastructure.Documentation.Swagger; using HubWeb.Controllers; namespace HubWeb.Documentation.Swagger diff --git a/Documentation/Swagger/SampleData/WebServiceSampleFactory.cs b/Documentation/Swagger/SampleData/WebServiceSampleFactory.cs deleted file mode 100644 index e3cb16f199..0000000000 --- a/Documentation/Swagger/SampleData/WebServiceSampleFactory.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Fr8.Infrastructure.Data.DataTransferObjects; - -namespace HubWeb.Documentation.Swagger -{ - public class WebServiceSampleFactory : ISwaggerSampleFactory - { - public WebServiceDTO GetSampleData() - { - return new WebServiceDTO - { - Name = "Built-In Services", - IconPath = "https://fr8.co/Content/img/site/site-logo.png" - }; - } - - object ISwaggerSampleFactory.GetSampleData() - { - return GetSampleData(); - } - } -} \ No newline at end of file diff --git a/Filters/RedirecLogedUserAttribute.cs b/Filters/RedirecLogedUserAttribute.cs new file mode 100644 index 0000000000..5b4d4ac40e --- /dev/null +++ b/Filters/RedirecLogedUserAttribute.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Mvc; +using System.Web.Routing; + +namespace HubWeb.Filters +{ + + public class RedirecLogedUserAttribute : ActionFilterAttribute + { + public override void OnActionExecuting(ActionExecutingContext filterContext) + { + base.OnActionExecuting(filterContext); + + if (filterContext.HttpContext.User.Identity.IsAuthenticated) + { + filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new + { + controller = "dashboard", + action = "Index" + })); + } + } + } +} \ No newline at end of file diff --git a/Fr8.sln b/Fr8.sln index c2771e6d6f..07025b4277 100644 --- a/Fr8.sln +++ b/Fr8.sln @@ -66,12 +66,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalPapertrail", "termi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalIntegrationTests", "Tests\terminalIntegrationTests\terminalIntegrationTests.csproj", "{579BA25F-1DF5-474A-8A3E-0447FF75711C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildUtils", "BuildUtils", "{932981E0-0644-4BED-84A9-FEF0664F6296}" - ProjectSection(SolutionItems) = preProject - BuildUtils\Handle.exe = BuildUtils\Handle.exe - BuildUtils\xcopy.exe = BuildUtils\xcopy.exe - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HealthMonitor", "Tests\HealthMonitor\HealthMonitor.csproj", "{83231577-13A5-419F-8269-02AE59D8951A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalDocuSignTests", "Tests\terminalDocuSignTests\terminalDocuSignTests.csproj", "{A6E317FA-2EB0-4447-8ECD-6725F6B78435}" @@ -112,10 +106,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalTest", "Tests\termi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalBox", "terminalBox\terminalBox.csproj", "{84800565-B464-471D-8F02-1A93311C3388}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{43A55C9F-CC6B-42C7-BE5A-0FBE635A0C02}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PlanDirectory", "Services\PlanDirectory\PlanDirectory.csproj", "{2B78433B-BA79-470B-BEF6-DBA5C1904865}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "terminalBoxTests", "Tests\terminalBoxTests\terminalBoxTests.csproj", "{1ABD6365-E04D-4971-8D0D-5364C896113F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Fr8Infrastructure.NET", "Fr8Infrastructure.NET\Fr8Infrastructure.NET.csproj", "{BBA91AF2-7636-41B6-87C4-C1575AE8B04B}" @@ -820,26 +810,6 @@ Global {84800565-B464-471D-8F02-1A93311C3388}.Release|Any CPU.Build.0 = Release|Any CPU {84800565-B464-471D-8F02-1A93311C3388}.Release|x86.ActiveCfg = Release|Any CPU {84800565-B464-471D-8F02-1A93311C3388}.Release|x86.Build.0 = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.alexlocal|Any CPU.ActiveCfg = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.alexlocal|Any CPU.Build.0 = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.alexlocal|x86.ActiveCfg = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.alexlocal|x86.Build.0 = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Debug|x86.ActiveCfg = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Debug|x86.Build.0 = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Demo|Any CPU.ActiveCfg = Demo|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Demo|Any CPU.Build.0 = Demo|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Demo|x86.ActiveCfg = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Demo|x86.Build.0 = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Dev|Any CPU.ActiveCfg = Dev|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Dev|Any CPU.Build.0 = Dev|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Dev|x86.ActiveCfg = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Dev|x86.Build.0 = Debug|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Release|Any CPU.Build.0 = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Release|x86.ActiveCfg = Release|Any CPU - {2B78433B-BA79-470B-BEF6-DBA5C1904865}.Release|x86.Build.0 = Release|Any CPU {1ABD6365-E04D-4971-8D0D-5364C896113F}.alexlocal|Any CPU.ActiveCfg = Release|Any CPU {1ABD6365-E04D-4971-8D0D-5364C896113F}.alexlocal|Any CPU.Build.0 = Release|Any CPU {1ABD6365-E04D-4971-8D0D-5364C896113F}.alexlocal|x86.ActiveCfg = Release|Any CPU @@ -1222,7 +1192,6 @@ Global {E46B602A-287B-450F-B455-5EED20C93EB7} = {9A01CAA2-30D9-45B5-9FF3-A0DDF12551F2} {267E6BE1-7C3A-4012-8EB4-DCDFB0FD6305} = {6CF6EAFB-0D62-4D76-8B2C-FA9C6BBB073B} {84800565-B464-471D-8F02-1A93311C3388} = {9A01CAA2-30D9-45B5-9FF3-A0DDF12551F2} - {2B78433B-BA79-470B-BEF6-DBA5C1904865} = {43A55C9F-CC6B-42C7-BE5A-0FBE635A0C02} {1ABD6365-E04D-4971-8D0D-5364C896113F} = {6CF6EAFB-0D62-4D76-8B2C-FA9C6BBB073B} {4F56C030-D16B-4A51-82D0-3C23A47AB703} = {6CF6EAFB-0D62-4D76-8B2C-FA9C6BBB073B} {459FE39A-A5CC-41D8-B06E-8FAE3A1A623B} = {6CF6EAFB-0D62-4D76-8B2C-FA9C6BBB073B} diff --git a/Fr8Infrastructure.NET/Data/Control/Control.cs b/Fr8Infrastructure.NET/Data/Control/Control.cs index 488106df6e..e24a8de058 100644 --- a/Fr8Infrastructure.NET/Data/Control/Control.cs +++ b/Fr8Infrastructure.NET/Data/Control/Control.cs @@ -680,6 +680,26 @@ public enum ContainerTransitions ProceedToNextActivity } + public static class ContainerTransitionsExtensions + { + public static bool RequiresTargetNodeId(this ContainerTransitions transition) + { + switch (transition) + { + case ContainerTransitions.JumpToActivity: + case ContainerTransitions.LaunchAdditionalPlan: + case ContainerTransitions.JumpToSubplan: + return true; + case ContainerTransitions.StopProcessing: + case ContainerTransitions.SuspendProcessing: + case ContainerTransitions.ProceedToNextActivity: + return false; + default: + throw new ArgumentOutOfRangeException(nameof(transition), transition, null); + } + } + } + public class ContainerTransitionField { [JsonProperty("conditions")] @@ -688,8 +708,10 @@ public class ContainerTransitionField [JsonProperty("transition")] public ContainerTransitions Transition { get; set; } - [JsonProperty("targetNodeId")] - public Guid? TargetNodeId; + [JsonProperty("name")] + public string Name { get; set; } + + [JsonProperty("targetNodeId")] public Guid? TargetNodeId; } public class FilterPaneField @@ -751,7 +773,6 @@ public UpstreamCrateChooser() [JsonProperty("multiSelection")] public bool MultiSelection { get; set; } - } public class CrateChooser : ControlDefinitionDTO @@ -827,6 +848,7 @@ public string URL } } } + public class BuildMessageAppender : TextArea { public BuildMessageAppender() diff --git a/Fr8Infrastructure.NET/Data/Convertors/JsonNet/ActivityTemplateActivityConverter.cs b/Fr8Infrastructure.NET/Data/Convertors/JsonNet/ActivityTemplateActivityConverter.cs index d84264565d..aeb59b6c1e 100644 --- a/Fr8Infrastructure.NET/Data/Convertors/JsonNet/ActivityTemplateActivityConverter.cs +++ b/Fr8Infrastructure.NET/Data/Convertors/JsonNet/ActivityTemplateActivityConverter.cs @@ -23,7 +23,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var customTerminalConverter = new TerminalActivityTemplateConverter(); - var customWebServiceConvert = new WebServiceConverter(); + var item = (ActivityTemplateDTO)value; writer.WriteStartObject(); writer.WritePropertyName("id"); @@ -38,16 +38,12 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s writer.WriteRawValue(JsonConvert.SerializeObject(item.Terminal, customTerminalConverter)); writer.WritePropertyName("tags"); writer.WriteValue(item.Tags); - writer.WritePropertyName("category"); - writer.WriteValue(item.Category.ToString()); writer.WritePropertyName("type"); writer.WriteValue(item.Type.ToString()); writer.WritePropertyName("minPaneWidth"); writer.WriteValue(item.MinPaneWidth); writer.WritePropertyName("needsAuthentication"); writer.WriteValue(item.NeedsAuthentication); - writer.WritePropertyName("webService"); - writer.WriteRawValue(JsonConvert.SerializeObject(item.WebService, customWebServiceConvert)); writer.WriteEndObject(); writer.Flush(); } diff --git a/Fr8Infrastructure.NET/Data/Convertors/JsonNet/WebServiceConverter.cs b/Fr8Infrastructure.NET/Data/Convertors/JsonNet/WebServiceConverter.cs deleted file mode 100644 index 6b372759eb..0000000000 --- a/Fr8Infrastructure.NET/Data/Convertors/JsonNet/WebServiceConverter.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Fr8.Infrastructure.Data.DataTransferObjects; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Fr8.Infrastructure.Data.Convertors.JsonNet -{ - public class WebServiceConverter : JsonConverter - { - public override bool CanConvert(Type objectType) - { - return objectType == typeof(WebServiceDTO); - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - var jsonObject = JObject.Load(reader); - var instance = (WebServiceDTO)Activator.CreateInstance(objectType); - serializer.Populate(jsonObject.CreateReader(), instance); - return instance; - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - if (value != null) - { - var item = (WebServiceDTO)value; - writer.WriteStartObject(); - writer.WritePropertyName("id"); - writer.WriteValue(item.Id); - writer.WritePropertyName("name"); - writer.WriteValue(item.Name); - writer.WritePropertyName("iconPath"); - writer.WriteValue(item.IconPath); - writer.WriteEndObject(); - writer.Flush(); - } - } - } -} diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategories.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategories.cs index a86747ce0d..0648f50948 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategories.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategories.cs @@ -1,60 +1,146 @@ -namespace Fr8.Infrastructure.Data.DataTransferObjects +using System; +using System.Collections.Generic; + +namespace Fr8.Infrastructure.Data.DataTransferObjects { public static class ActivityCategories { private readonly static ActivityCategoryDTO _monitor = new ActivityCategoryDTO() { - Name = "Monitor", + Id = MonitorId, + Name = MonitorName, IconPath = "/Content/icons/monitor-icon-64x64.png" }; private readonly static ActivityCategoryDTO _receive = new ActivityCategoryDTO() { - Name = "Get", + Id = ReceiveId, + Name = ReceiveName, IconPath = "/Content/icons/get-icon-64x64.png" }; private readonly static ActivityCategoryDTO _process = new ActivityCategoryDTO() { - Name = "Process", + Id = ProcessId, + Name = ProcessName, IconPath = "/Content/icons/process-icon-64x64.png" }; private readonly static ActivityCategoryDTO _forward = new ActivityCategoryDTO() { - Name = "Forward", + Id = ForwardId, + Name = ForwardName, IconPath = "/Content/icons/forward-icon-64x64.png" }; private readonly static ActivityCategoryDTO _solution = new ActivityCategoryDTO() { - Name = "Solution" + Id = SolutionId, + Name = SolutionName + }; + + private readonly static List _categoryIds = new List() + { + MonitorId, + ReceiveId, + ProcessId, + ForwardId, + SolutionId }; + private readonly static List _categories = new List() + { + Monitor, + Receive, + Process, + Forward, + Solution + }; + + + public static Guid MonitorId + { + get { return Guid.Parse("417DD061-27A1-4DEC-AECD-4F468013FD24"); } + } + + public static string MonitorName + { + get { return "Triggers"; } + } public static ActivityCategoryDTO Monitor { get { return _monitor; } } + public static Guid ReceiveId + { + get { return Guid.Parse("29EFB1D7-A9EA-41C5-AC60-AEF1F520E814"); } + } + + public static string ReceiveName + { + get { return "Get Data"; } + } + public static ActivityCategoryDTO Receive { get { return _receive; } } + public static Guid ProcessId + { + get { return Guid.Parse("69FB6D2C-2083-4696-9457-B7B152D358C2"); } + } + + public static string ProcessName + { + get { return "Process"; } + } + public static ActivityCategoryDTO Process { get { return _process; } } + public static Guid ForwardId + { + get { return Guid.Parse("AFD7E981-A21A-4B05-B0B1-3115A5448F22"); } + } + + public static string ForwardName + { + get { return "Ship Data"; } + } + public static ActivityCategoryDTO Forward { get { return _forward; } } + public static Guid SolutionId + { + get { return Guid.Parse("F9DF2AC2-2F10-4D21-B97A-987D46AD65B0"); } + } + + public static string SolutionName + { + get { return "Solution"; } + } + public static ActivityCategoryDTO Solution { get { return _solution; } } + + public static List ActivityCategoryIds + { + get { return _categoryIds; } + } + + public static List ActivityCategoryList + { + get { return _categories; } + } } } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategoryDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategoryDTO.cs index 24c75aa423..26172d460b 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategoryDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityCategoryDTO.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace Fr8.Infrastructure.Data.DataTransferObjects @@ -13,10 +14,42 @@ public ActivityCategoryDTO(string name, string iconPath) IconPath = iconPath; } + public ActivityCategoryDTO(Guid id, string name, string iconPath) + { + Id = id; + Name = name; + IconPath = iconPath; + } + + [JsonProperty("id")] + public Guid Id { get; set; } + [JsonProperty("name")] public string Name { get; set; } [JsonProperty("iconPath")] public string IconPath { get; set; } + + + private sealed class NameEqualityComparer : IEqualityComparer + { + public bool Equals(ActivityCategoryDTO x, ActivityCategoryDTO y) + { + if (ReferenceEquals(x, y)) return true; + if (ReferenceEquals(x, null)) return false; + if (ReferenceEquals(y, null)) return false; + if (x.GetType() != y.GetType()) return false; + return string.Equals(x.Name, y.Name); + } + + public int GetHashCode(ActivityCategoryDTO obj) + { + return (obj.Name != null ? obj.Name.GetHashCode() : 0); + } + } + + private static readonly IEqualityComparer NameComparerInstance = new NameEqualityComparer(); + + public static IEqualityComparer NameComparer => NameComparerInstance; } } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityDTO.cs index 7c61110ba4..861c201127 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityDTO.cs @@ -9,9 +9,6 @@ public class ActivityDTO [JsonProperty("label")] public string Label { get; set; } - [JsonProperty("name")] - public string Name { get; set; } - [JsonProperty("activityTemplate")] public ActivityTemplateSummaryDTO ActivityTemplate { get; set; } @@ -21,9 +18,6 @@ public class ActivityDTO [JsonProperty("parentPlanNodeId")] public Guid? ParentPlanNodeId { get; set; } - [JsonProperty("currentView")] - public string CurrentView { get; set; } - [JsonProperty("ordering")] public int Ordering { get; set; } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateCategoryDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateCategoryDTO.cs index 752f7bed66..6c50c2f4c2 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateCategoryDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateCategoryDTO.cs @@ -1,10 +1,14 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace Fr8.Infrastructure.Data.DataTransferObjects { public class ActivityTemplateCategoryDTO { + [JsonProperty("id")] + public Guid? Id { get; set; } + [JsonProperty("name")] public string Name { get; set; } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateDTO.cs index 2582bbe400..9a1114858d 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/ActivityTemplateDTO.cs @@ -46,9 +46,6 @@ public ActivityTemplateDTO() [JsonProperty("version")] public string Version { get; set; } - [JsonProperty("webService")] - public WebServiceDTO WebService { get; set; } - [JsonProperty("terminal")] public TerminalDTO Terminal { get; set; } @@ -58,10 +55,6 @@ public ActivityTemplateDTO() [JsonProperty("categories")] public ActivityCategoryDTO[] Categories { get; set; } - [JsonProperty("category")] - [JsonConverter(typeof(StringEnumConverter))] - public ActivityCategory Category { get; set; } - [JsonProperty("type")] [JsonConverter(typeof(StringEnumConverter))] public ActivityType Type { get; set; } @@ -74,5 +67,8 @@ public ActivityTemplateDTO() [JsonProperty("showDocumentation")] public ActivityResponseDTO ShowDocumentation { get; set; } + + [JsonProperty("description")] + public string Description { get; set; } } } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthenticationTokenDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthenticationTokenDTO.cs index 503f14a52a..f07510b07c 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthenticationTokenDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthenticationTokenDTO.cs @@ -7,7 +7,7 @@ namespace Fr8.Infrastructure.Data.DataTransferObjects public class AuthenticationTokenTerminalDTO { [JsonProperty("id")] - public int Id { get; set; } + public Guid Id { get; set; } [JsonProperty("name")] public string Name { get; set; } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthorizationTokenDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthorizationTokenDTO.cs index 2ce054efb1..3dbe88c651 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthorizationTokenDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/AuthorizationTokenDTO.cs @@ -44,6 +44,6 @@ public class AuthorizationTokenDTO //TODO remove this [JsonProperty("terminalId")] - public int TerminalID { get; set; } + public Guid TerminalID { get; set; } } } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/InternalDemoAccountDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/InternalDemoAccountDTO.cs new file mode 100644 index 0000000000..80e022c94f --- /dev/null +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/InternalDemoAccountDTO.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace Fr8.Infrastructure.Data.DataTransferObjects +{ + public class InternalDemoAccountDTO + { + [JsonProperty("username")] + public string Username { get; set; } + + [JsonProperty("password")] + public string Password { get; set; } + + [JsonProperty("domain")] + public string Domain { get; set; } + + [JsonProperty("hasDemoAccount")] + public bool HasDemoAccount { get; set; } + } +} diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDTO.cs index 1e70df4324..4026b3f4eb 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDTO.cs @@ -15,7 +15,7 @@ public class PlanDTO : PlanNoChildrenDTO ///
public IEnumerable SubPlans { get; set; } - [JsonProperty("fr8UserId")] + [JsonProperty("ownerId")] public string Fr8UserId { get; set; } } @@ -50,7 +50,7 @@ public class PlanQueryDTO /// Status to filter plans by ///
[JsonProperty("status")] - public int? Status { get; set; } + public string Status { get; set; } /// /// Category to filter plans by /// diff --git a/Services/PlanDirectory/Interfaces/CreatePlanDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/CreatePlanDTO.cs similarity index 56% rename from Services/PlanDirectory/Interfaces/CreatePlanDTO.cs rename to Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/CreatePlanDTO.cs index e2d78f0b95..719ef03558 100644 --- a/Services/PlanDirectory/Interfaces/CreatePlanDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/CreatePlanDTO.cs @@ -1,4 +1,4 @@ -namespace PlanDirectory.Interfaces +namespace Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory { public class CreatePlanDTO { diff --git a/Services/PlanDirectory/Interfaces/SearchItemDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchItemDTO.cs similarity index 78% rename from Services/PlanDirectory/Interfaces/SearchItemDTO.cs rename to Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchItemDTO.cs index b43225fe16..405dad1f5c 100644 --- a/Services/PlanDirectory/Interfaces/SearchItemDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchItemDTO.cs @@ -1,6 +1,6 @@ using System; -namespace PlanDirectory.Interfaces +namespace Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory { public class SearchItemDTO { diff --git a/Services/PlanDirectory/Interfaces/SearchRequestDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchRequestDTO.cs similarity index 71% rename from Services/PlanDirectory/Interfaces/SearchRequestDTO.cs rename to Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchRequestDTO.cs index 28000d0d3e..c11e57b46b 100644 --- a/Services/PlanDirectory/Interfaces/SearchRequestDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchRequestDTO.cs @@ -1,4 +1,4 @@ -namespace PlanDirectory.Interfaces +namespace Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory { public class SearchRequestDTO { diff --git a/Services/PlanDirectory/Interfaces/SearchResultDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchResultDTO.cs similarity index 74% rename from Services/PlanDirectory/Interfaces/SearchResultDTO.cs rename to Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchResultDTO.cs index 76a6778f2b..603f93fa32 100644 --- a/Services/PlanDirectory/Interfaces/SearchResultDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanDirectory/SearchResultDTO.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace PlanDirectory.Interfaces +namespace Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory { public class SearchResultDTO { diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanNoChildrenDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanNoChildrenDTO.cs index efb17ec59e..da04b67df1 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanNoChildrenDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/PlanNoChildrenDTO.cs @@ -24,7 +24,7 @@ public class PlanNoChildrenDTO public DateTimeOffset LastUpdated { get; set; } [JsonProperty("planState")] - public int PlanState { get; set; } + public string PlanState { get; set; } [JsonProperty("startingSubPlanId")] public Guid StartingSubPlanId { get; set; } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalDTO.cs index 6c7862fa51..d35d5ad1cf 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalDTO.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Newtonsoft.Json; namespace Fr8.Infrastructure.Data.DataTransferObjects @@ -10,11 +11,9 @@ public TerminalDTO() AuthenticationType = States.AuthenticationType.None; Roles = new List(); } - - [JsonProperty("id")] - public string PublicIdentifier { get; set; } + [JsonProperty("InternalId")] - public int InternalId { get; set; } + public Guid InternalId { get; set; } [JsonProperty("name")] public string Name { get; set; } [JsonProperty("label")] @@ -23,12 +22,20 @@ public TerminalDTO() public string Version { get; set; } [JsonProperty("terminalStatus")] public int TerminalStatus { get; set; } + [JsonProperty("participationState")] + public int ParticipationState { get; set; } [JsonProperty("endpoint")] public string Endpoint { get; set; } [JsonProperty("description")] public string Description { get; set; } [JsonProperty("authenticationType")] public int AuthenticationType { get; set; } + [JsonProperty("devUrl")] + public string DevUrl { get; set; } + [JsonProperty("prodUrl")] + public string ProdUrl { get; set; } + [JsonProperty("isFr8OwnTerminal")] + public bool IsFr8OwnTerminal { get; set; } /// /// Allowed roles for users, determing Terminal Permissions /// diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalRegistrationDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalRegistrationDTO.cs deleted file mode 100644 index 7022ef7a7c..0000000000 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/TerminalRegistrationDTO.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace Fr8.Infrastructure.Data.DataTransferObjects -{ - public class TerminalRegistrationDTO - { - [JsonProperty("endpoint")] - public string Endpoint { get; set; } - } -} diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/TokenResponseDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/TokenResponseDTO.cs index 182a3971a4..de30e32978 100644 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/TokenResponseDTO.cs +++ b/Fr8Infrastructure.NET/Data/DataTransferObjects/TokenResponseDTO.cs @@ -1,11 +1,12 @@ -using Newtonsoft.Json; +using System; +using Newtonsoft.Json; namespace Fr8.Infrastructure.Data.DataTransferObjects { public class TokenResponseDTO { [JsonProperty("terminalId")] - public int? TerminalId { get; set; } + public Guid? TerminalId { get; set; } [JsonProperty("terminalName")] public string TerminalName { get; set; } diff --git a/Fr8Infrastructure.NET/Data/DataTransferObjects/WebServiceDTO.cs b/Fr8Infrastructure.NET/Data/DataTransferObjects/WebServiceDTO.cs deleted file mode 100644 index 5acb7e58e1..0000000000 --- a/Fr8Infrastructure.NET/Data/DataTransferObjects/WebServiceDTO.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace Fr8.Infrastructure.Data.DataTransferObjects -{ - public class WebServiceDTO - { - private sealed class NameEqualityComparer : IEqualityComparer - { - public bool Equals(WebServiceDTO x, WebServiceDTO y) - { - if (ReferenceEquals(x, y)) return true; - if (ReferenceEquals(x, null)) return false; - if (ReferenceEquals(y, null)) return false; - if (x.GetType() != y.GetType()) return false; - return string.Equals(x.Name, y.Name); - } - - public int GetHashCode(WebServiceDTO obj) - { - return (obj.Name != null ? obj.Name.GetHashCode() : 0); - } - } - - private static readonly IEqualityComparer NameComparerInstance = new NameEqualityComparer(); - - public static IEqualityComparer NameComparer => NameComparerInstance; - - [JsonProperty("id")] - public int Id { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("iconPath")] - public string IconPath { get; set; } - } -} \ No newline at end of file diff --git a/Fr8Infrastructure.NET/Data/States/ActivityCategory.cs b/Fr8Infrastructure.NET/Data/States/ActivityCategory.cs deleted file mode 100644 index e679fcad22..0000000000 --- a/Fr8Infrastructure.NET/Data/States/ActivityCategory.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Fr8.Infrastructure.Data.States -{ - public enum ActivityCategory - { - Monitors = 1, - Receivers = 2, - Processors = 3, - Forwarders = 4, - Solution = 5 - } -} - \ No newline at end of file diff --git a/Fr8Infrastructure.NET/Data/States/TerminalStatus.cs b/Fr8Infrastructure.NET/Data/States/TerminalStatus.cs index 8bbd821600..6304ee64a5 100644 --- a/Fr8Infrastructure.NET/Data/States/TerminalStatus.cs +++ b/Fr8Infrastructure.NET/Data/States/TerminalStatus.cs @@ -2,7 +2,8 @@ { public class TerminalStatus { - public const int Inactive = 0; + public const int Undiscovered = 0; public const int Active = 1; + public const int Inactive = 2; } } diff --git a/Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs b/Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs similarity index 69% rename from Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs index ec1c2a83f1..b4b3269ca1 100644 --- a/Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/AddDefaultValuesDocumentFilter.cs @@ -1,12 +1,13 @@ using System; using System.Collections.Generic; +using System.Data.Linq; using System.Linq; using System.Web.Http.Description; using StructureMap; using StructureMap.Pipeline; using Swashbuckle.Swagger; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { //This class produces sample data for complex objects to be displayed in Swagger UI //In order to provide sample value for your type just add a class that implements ISwaggerSampleFactory @@ -14,13 +15,20 @@ namespace HubWeb.Documentation.Swagger //But make sure first that such class doesn't already exist. See examples in Documentation/Swagger/SampleData folder public class AddDefaultValuesDocumentFilter : IDocumentFilter { - private readonly IContainer _container; + protected readonly IContainer _container; + + protected readonly Dictionary _defaultFactoriesByTypeName; - private readonly Dictionary _defaultFactoriesByTypeName; public AddDefaultValuesDocumentFilter() { _container = new Container(); - var thisAssembly = GetType().Assembly; + _defaultFactoriesByTypeName = new Dictionary(); + AddDefaultFactoriesFromTypeAssembly(typeof(AddDefaultValuesDocumentFilter)); + } + + protected void AddDefaultFactoriesFromTypeAssembly(Type type) + { + var thisAssembly = type.Assembly; var defaultValueFactories = thisAssembly.GetTypes() .Where(x => x.IsClass) .Select(x => new {Type = x, Interface = x.GetInterface("ISwaggerSampleFactory`1")}) @@ -33,7 +41,15 @@ public AddDefaultValuesDocumentFilter() x.For(defaultValueFactory.Interface, new SingletonLifecycle()).Use(defaultValueFactory.Type); } }); - _defaultFactoriesByTypeName = defaultValueFactories.ToDictionary(x => GetSwaggerTypeName(x.Interface), x => x.Interface); + foreach (var defaultValueFactory in defaultValueFactories) + { + var swaggerTypeName = GetSwaggerTypeName(defaultValueFactory.Interface); + if (_defaultFactoriesByTypeName.ContainsKey(swaggerTypeName)) + { + throw new DuplicateKeyException(swaggerTypeName, $"There is already a sample data factory associated with {swaggerTypeName} type"); + } + _defaultFactoriesByTypeName.Add(swaggerTypeName, defaultValueFactory.Interface); + } } private string GetSwaggerTypeName(Type @interface) diff --git a/Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs b/Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs similarity index 95% rename from Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs index 5ad602e468..fb78e345ba 100644 --- a/Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/DocumentFilters/RemoveDuplicatesDocumentFilter.cs @@ -2,7 +2,7 @@ using System.Web.Http.Description; using Swashbuckle.Swagger; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class RemoveDuplicatesDocumentFilter : IDocumentFilter { diff --git a/Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs b/Fr8Infrastructure.NET/Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs similarity index 93% rename from Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs index 5b6a4f7827..1d0c2f4444 100644 --- a/Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/OperationFilters/RemoveParameterModelNameOperationFilter.cs @@ -2,7 +2,7 @@ using System.Web.Http.Description; using Swashbuckle.Swagger; -namespace HubWeb.Documentation.Swagger.OperationFilters +namespace Fr8.Infrastructure.Documentation.Swagger { //This class simple removes name of model from some parameter names //In case your controller's method has complex object as a parameter and it is marked by [FromUri] attribute diff --git a/Documentation/Swagger/SampleData/ActivitySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivitySampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/ActivitySampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivitySampleFactory.cs index 4f124fbca5..2bbb7f11a3 100644 --- a/Documentation/Swagger/SampleData/ActivitySampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivitySampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger.SampleData +namespace Fr8.Infrastructure.Documentation.Swagger { public class ActivitySampleFactory : ISwaggerSampleFactory { @@ -16,7 +16,6 @@ public ActivityDTO GetSampleData() { return new ActivityDTO { - Name = "Send_Message_v1", Label = "Send Message", Id = Guid.Parse("06D08982-6337-4E6F-AA59-0210D17F6861"), ParentPlanNodeId = Guid.Parse("4C21492F-80B6-4495-9602-E38697B916B2"), diff --git a/Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs similarity index 67% rename from Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs index c626cf85a7..9c36e57690 100644 --- a/Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSampleFactory.cs @@ -1,18 +1,15 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger.SampleData +namespace Fr8.Infrastructure.Documentation.Swagger { public class ActivityTemplateSampleFactory : ISwaggerSampleFactory { private readonly ISwaggerSampleFactory _terminalSampleFactory; - private readonly ISwaggerSampleFactory _webServiceSampleFactory; - public ActivityTemplateSampleFactory(ISwaggerSampleFactory terminalSampleFactory, ISwaggerSampleFactory webServiceSampleFactory) + public ActivityTemplateSampleFactory(ISwaggerSampleFactory terminalSampleFactory) { _terminalSampleFactory = terminalSampleFactory; - _webServiceSampleFactory = webServiceSampleFactory; } public ActivityTemplateDTO GetSampleData() @@ -22,10 +19,8 @@ public ActivityTemplateDTO GetSampleData() Id = Guid.Parse("D64F823D-E127-41E5-A3E5-0D48BA2750DB"), Name = "Build_Message", Label = "Build a Message", - Category = ActivityCategory.Processors, Version = "1", MinPaneWidth = 330, - WebService = _webServiceSampleFactory.GetSampleData(), Terminal = _terminalSampleFactory.GetSampleData(), Tags = string.Empty }; diff --git a/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSummarySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSummarySampleFactory.cs new file mode 100644 index 0000000000..e86d59be1e --- /dev/null +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ActivityTemplateSummarySampleFactory.cs @@ -0,0 +1,23 @@ +using Fr8.Infrastructure.Data.DataTransferObjects; + +namespace Fr8.Infrastructure.Documentation.Swagger +{ + public class ActivityTemplateSummarySampleFactory : ISwaggerSampleFactory + { + public ActivityTemplateSummaryDTO GetSampleData() + { + return new ActivityTemplateSummaryDTO + { + Version = "1", + Name = "Build_Message", + TerminalName = "terminalFr8Core", + TerminalVersion = "1" + }; + } + + object ISwaggerSampleFactory.GetSampleData() + { + return GetSampleData(); + } + } +} \ No newline at end of file diff --git a/Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs index 2a0fda78e7..fddcb7abb2 100644 --- a/Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenGrantSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class AuthenticationTokenGrantSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs index bfcde4be64..4bfc13bda4 100644 --- a/Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class AuthenticationTokenSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs similarity index 85% rename from Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs index 73495ac023..0d66788d51 100644 --- a/Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthenticationTokenTerminalSampleFactory.cs @@ -1,7 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class AuthenticationTokenTerminalSampleFactory : ISwaggerSampleFactory { @@ -17,7 +18,7 @@ public AuthenticationTokenTerminalDTO GetSampleData() return new AuthenticationTokenTerminalDTO { Name = "terminalFr8Core", - Id = 1, + Id = Guid.Parse("2757F870-A508-429E-A706-9EE826D92237"), Label = "Display Name", Version = "1", AuthenticationType = 0, diff --git a/Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs similarity index 89% rename from Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs index 2cea0594d3..e647c6ae21 100644 --- a/Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/AuthorizationTokenSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class AuthorizationTokenSampleFactory : ISwaggerSampleFactory { @@ -19,7 +19,7 @@ public AuthorizationTokenDTO GetSampleData() ExternalDomainId = "D123456", ExternalDomainName = "somedomain", ExternalStateToken = "CBFF1688-99E8-4FC2-A526-C02D98CB5944", - TerminalID = 5, + TerminalID = Guid.Parse("B125F7D4-7A3F-47B2-90D5-932AC1CE5F48"), Token = "QWERTYUIOPASDFGGHJKLZXCBNM", UserId = "6115F7D4-7A3F-47B2-90D5-932AC1CE5F48" }; diff --git a/Documentation/Swagger/SampleData/ContainerSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ContainerSampleFactory.cs similarity index 96% rename from Documentation/Swagger/SampleData/ContainerSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ContainerSampleFactory.cs index 6117005c01..7354109499 100644 --- a/Documentation/Swagger/SampleData/ContainerSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ContainerSampleFactory.cs @@ -3,7 +3,7 @@ using Fr8.Infrastructure.Data.Constants; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ContainerSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs index 19028b2f8e..e8747a3496 100644 --- a/Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateDescriptionSampleFactory.cs @@ -1,10 +1,9 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Fr8.Infrastructure.Data.Constants; using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class CrateDescriptionSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/CrateSampeFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateSampeFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/CrateSampeFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateSampeFactory.cs index a8d7ee444e..ed38ba9478 100644 --- a/Documentation/Swagger/SampleData/CrateSampeFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateSampeFactory.cs @@ -4,7 +4,7 @@ using Fr8.Infrastructure.Data.States; using Newtonsoft.Json.Linq; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class CrateSampeFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs similarity index 86% rename from Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs index 49b7c05136..6a74541818 100644 --- a/Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CrateStorageSampleFactory.cs @@ -1,7 +1,6 @@ -using System; -using Fr8.Infrastructure.Data.DataTransferObjects; +using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class CrateStorageSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/CredentialsSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CredentialsSampleFactory.cs similarity index 89% rename from Documentation/Swagger/SampleData/CredentialsSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CredentialsSampleFactory.cs index f5e1e26278..a85030a8f8 100644 --- a/Documentation/Swagger/SampleData/CredentialsSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/CredentialsSampleFactory.cs @@ -1,7 +1,6 @@ -using System; -using Fr8.Infrastructure.Data.DataTransferObjects; +using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class CredentialsSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs index a9ab567447..eab725b4d6 100644 --- a/Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/DocumentationResponseSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class DocumentationResponseSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/FactSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FactSampleFactory.cs similarity index 94% rename from Documentation/Swagger/SampleData/FactSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FactSampleFactory.cs index 4cb90ee60a..e5a037126a 100644 --- a/Documentation/Swagger/SampleData/FactSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FactSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class FactSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/FieldSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FieldSampleFactory.cs similarity index 94% rename from Documentation/Swagger/SampleData/FieldSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FieldSampleFactory.cs index ab9c305c89..e66063569c 100644 --- a/Documentation/Swagger/SampleData/FieldSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FieldSampleFactory.cs @@ -3,7 +3,7 @@ using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class FieldSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/FileSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FileSampleFactory.cs similarity index 91% rename from Documentation/Swagger/SampleData/FileSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FileSampleFactory.cs index e4e1183f0f..fb56c75d61 100644 --- a/Documentation/Swagger/SampleData/FileSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FileSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class FileSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs similarity index 90% rename from Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs index 17ecb2b924..29d978fd80 100644 --- a/Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FilterConditionSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class FilterConditionSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs index dd00749374..6793af3915 100644 --- a/Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/FullSubplanSampleFactory.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class FullSubplanSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs similarity index 94% rename from Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs index a529982228..2e55830b89 100644 --- a/Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/HistoryResultSampleFactory.cs @@ -1,8 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class HistoryResultIcidentSampleFactory : ISwaggerSampleFactory> { diff --git a/Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs similarity index 87% rename from Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs index 1afe58dfb5..5f007e7d90 100644 --- a/Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ISwaggerSampleFactory.cs @@ -1,4 +1,4 @@ -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public interface ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/IncidentSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncidentSampleFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/IncidentSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncidentSampleFactory.cs index 1b7660f96f..9b30391824 100644 --- a/Documentation/Swagger/SampleData/IncidentSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncidentSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class IncidentSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs index 07e5104bce..68f3c5b58b 100644 --- a/Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/IncomingCratesSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class IncomingCratesSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs index ddce47e728..7d68ac1fe3 100644 --- a/Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ManifestDescriptionSampleFactory.cs @@ -1,7 +1,7 @@ using Fr8.Infrastructure.Data.DataTransferObjects; using Newtonsoft.Json; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ManifestDescriptionSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/OrganizationSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/OrganizationSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/OrganizationSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/OrganizationSampleFactory.cs index 3c04e77e09..ec458b1af2 100644 --- a/Documentation/Swagger/SampleData/OrganizationSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/OrganizationSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class OrganizationSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs index f31bdfa378..f44260c9d2 100644 --- a/Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PageDefinitionSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PageDefinitionSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/PayloadSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PayloadSampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/PayloadSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PayloadSampleFactory.cs index bb910bd972..3427717275 100644 --- a/Documentation/Swagger/SampleData/PayloadSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PayloadSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PayloadSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs similarity index 91% rename from Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs index 4edc324482..6ed8c77931 100644 --- a/Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberCredentialsSampleFactory.cs @@ -1,7 +1,6 @@ -using System; -using Fr8.Infrastructure.Data.DataTransferObjects; +using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PhoneNumberCredentialsSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs similarity index 84% rename from Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs index fb4a9ccd27..393d3bd1a6 100644 --- a/Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PhoneNumberVerificationSampleFactory.cs @@ -1,7 +1,6 @@ using System; -using Fr8.Infrastructure; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PhoneNumberVerificationSampleFactory : ISwaggerSampleFactory { @@ -14,7 +13,7 @@ public PhoneNumberVerificationDTO GetSampleData() ClientName = "Your Name", Message = "Hey here is your code", ClientId = "8FAB9D02-B731-424B-AE06-56B2C90BAA0A", - TerminalId = 1, + TerminalId = Guid.Parse("2757F870-A508-429E-A706-9EE826D92237"), TerminalName = "terminalFr8Core" }; } diff --git a/Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs similarity index 85% rename from Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs index 01cf46725f..f89e570ebf 100644 --- a/Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanEmptySampleFactory.cs @@ -1,9 +1,7 @@ using System; -using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; -using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PlanEmptySampleFactory : ISwaggerSampleFactory { @@ -16,7 +14,7 @@ public PlanNoChildrenDTO GetSampleData() Description = "Plan Description", LastUpdated = DateTimeOffset.Now, Category = "Solutions", - PlanState = PlanState.Inactive, + PlanState = "Inactive", StartingSubPlanId = Guid.Parse("39080509-1A69-43E6-910F-38C84B84324C"), Tag = "some tags", Visibility = new PlanVisibilityDTO() { Hidden = false } diff --git a/Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs similarity index 88% rename from Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs index b3c3d8ef19..c12014d87c 100644 --- a/Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanQuerySampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PlanQuerySampleFactory : ISwaggerSampleFactory { @@ -16,7 +16,7 @@ public PlanQueryDTO GetSampleData() OrderBy = "-name", Page = 1, PlanPerPage = 50, - Status = 1 + Status = "Inactive" }; } diff --git a/Documentation/Swagger/SampleData/PlanResultSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanResultSampleFactory.cs similarity index 90% rename from Documentation/Swagger/SampleData/PlanResultSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanResultSampleFactory.cs index 52189032cf..0ccb292953 100644 --- a/Documentation/Swagger/SampleData/PlanResultSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanResultSampleFactory.cs @@ -1,8 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PlanResultSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/PlanFullSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanSampleFactory.cs similarity index 77% rename from Documentation/Swagger/SampleData/PlanFullSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanSampleFactory.cs index 0ccefa8ee0..1d64bae08b 100644 --- a/Documentation/Swagger/SampleData/PlanFullSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PlanSampleFactory.cs @@ -1,14 +1,12 @@ using System; -using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; -using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { - public class PlanFullSampleFactory : ISwaggerSampleFactory + public class PlanSampleFactory : ISwaggerSampleFactory { private readonly ISwaggerSampleFactory _fullSubplanSampleFactory; - public PlanFullSampleFactory(ISwaggerSampleFactory fullSubplanSampleFactory) + public PlanSampleFactory(ISwaggerSampleFactory fullSubplanSampleFactory) { _fullSubplanSampleFactory = fullSubplanSampleFactory; } @@ -22,7 +20,7 @@ public PlanDTO GetSampleData() Description = "Plan Description", LastUpdated = DateTimeOffset.Now, Category = "Solutions", - PlanState = PlanState.Inactive, + PlanState = "Inactive", StartingSubPlanId = Guid.Parse("39080509-1A69-43E6-910F-38C84B84324C"), Tag = "some tags", Visibility = new PlanVisibilityDTO() { Hidden = false }, diff --git a/Documentation/Swagger/SampleData/PollingDataSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PollingDataSampleFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/PollingDataSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PollingDataSampleFactory.cs index 26fbf8cdd0..5dfcd63f90 100644 --- a/Documentation/Swagger/SampleData/PollingDataSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/PollingDataSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class PollingDataSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/ProfileSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ProfileSampleFactory.cs similarity index 90% rename from Documentation/Swagger/SampleData/ProfileSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ProfileSampleFactory.cs index a73ed65364..1267c8276a 100644 --- a/Documentation/Swagger/SampleData/ProfileSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ProfileSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ProfileSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/QuerySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/QuerySampleFactory.cs similarity index 94% rename from Documentation/Swagger/SampleData/QuerySampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/QuerySampleFactory.cs index eb4f4a4e72..4c81172833 100644 --- a/Documentation/Swagger/SampleData/QuerySampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/QuerySampleFactory.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class QuerySampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs index 56f3e59a41..230fd4d3e1 100644 --- a/Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ResponseMessageSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ResponseMessageSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/SubplanSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/SubplanSampleFactory.cs similarity index 92% rename from Documentation/Swagger/SampleData/SubplanSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/SubplanSampleFactory.cs index 4567115b87..4f6fced503 100644 --- a/Documentation/Swagger/SampleData/SubplanSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/SubplanSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class SubplanSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs similarity index 94% rename from Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs index c74c68fb4a..13ed4422bf 100644 --- a/Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalNotificationSampleFactory.cs @@ -1,7 +1,7 @@ using Fr8.Infrastructure.Data.Constants; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class TerminalNotificationSampleFactory : ISwaggerSampleFactory { @@ -10,12 +10,12 @@ public NotificationMessageDTO GetSampleData() return new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Good Message", Message = "Something good just happened", TerminalName = "terminalFr8Core", ActivityName = "Build_Message_v1", ActivityVersion = "1", Collapsed = false, - Subject = "Good Message", TerminalVersion = "1" }; } diff --git a/Documentation/Swagger/SampleData/TerminalSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSampleFactory.cs similarity index 85% rename from Documentation/Swagger/SampleData/TerminalSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSampleFactory.cs index d313852012..75082a339b 100644 --- a/Documentation/Swagger/SampleData/TerminalSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSampleFactory.cs @@ -1,7 +1,7 @@ using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.States; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class TerminalSampleFactory : ISwaggerSampleFactory { @@ -14,7 +14,6 @@ public TerminalDTO GetSampleData() Name = "terminalFr8Core", Label = "Fr8Core", Version = "1", - PublicIdentifier = "2DB48191-CDA3-4922-9CC2-A636E828063F" }; } diff --git a/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSummarySampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSummarySampleFactory.cs new file mode 100644 index 0000000000..ae292787a1 --- /dev/null +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TerminalSummarySampleFactory.cs @@ -0,0 +1,21 @@ +using Fr8.Infrastructure.Data.DataTransferObjects; + +namespace Fr8.Infrastructure.Documentation.Swagger +{ + public class TerminalSummarySampleFactory : ISwaggerSampleFactory + { + public TerminalSummaryDTO GetSampleData() + { + return new TerminalSummaryDTO + { + Version = "1", + Name = "terminalFr8Core" + }; + } + + object ISwaggerSampleFactory.GetSampleData() + { + return GetSampleData(); + } + } +} \ No newline at end of file diff --git a/Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs similarity index 81% rename from Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs index 532e6bf944..d4881d338e 100644 --- a/Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/TokenResponseSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class TokenResponseSampleFactory : ISwaggerSampleFactory { @@ -12,7 +12,7 @@ public TokenResponseDTO GetSampleData() Error = string.Empty, AuthTokenId = "5184F18C-4306-46CE-8F43-6DD30D242F74", TerminalName = "terminalFr8Core", - TerminalId = 1 + TerminalId = Guid.Parse("AB84F18C-4306-46CE-8F43-6DD30D242F74") }; } diff --git a/Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs similarity index 90% rename from Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs index 758a04b5bf..8b65efbaf7 100644 --- a/Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UrlResponseSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class UrlResponseSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/UserSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UserSampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/UserSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UserSampleFactory.cs index 3689f08970..41a0237983 100644 --- a/Documentation/Swagger/SampleData/UserSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/UserSampleFactory.cs @@ -1,7 +1,7 @@ using System; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class UserSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs similarity index 93% rename from Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs index f48e36876a..113c38ada1 100644 --- a/Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationErrorsSampleFactory.cs @@ -1,6 +1,6 @@ using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ValidationErrorsSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs similarity index 91% rename from Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs index 34d42ceaa6..929e053c0e 100644 --- a/Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/ValidationResultSampleFactory.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class ValidationResultSampleFactory : ISwaggerSampleFactory { diff --git a/Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs similarity index 95% rename from Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs rename to Fr8Infrastructure.NET/Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs index bfdb199116..0873e4b64e 100644 --- a/Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs +++ b/Fr8Infrastructure.NET/Documentation/Swagger/SampleData/WebServiceActivitySetSampleFactory.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using Fr8.Infrastructure.Data.DataTransferObjects; -namespace HubWeb.Documentation.Swagger +namespace Fr8.Infrastructure.Documentation.Swagger { public class WebServiceActivitySetSampleFactory : ISwaggerSampleFactory { diff --git a/Fr8Infrastructure.NET/Fr8Infrastructure.NET.csproj b/Fr8Infrastructure.NET/Fr8Infrastructure.NET.csproj index 3df09b2d66..38249edc1d 100644 --- a/Fr8Infrastructure.NET/Fr8Infrastructure.NET.csproj +++ b/Fr8Infrastructure.NET/Fr8Infrastructure.NET.csproj @@ -57,6 +57,10 @@ ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll True + + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + True + ..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll True @@ -85,10 +89,15 @@ ..\packages\structuremap.3.1.6.186\lib\net40\StructureMap.Net4.dll True + + ..\packages\Swashbuckle.Core.5.3.2\lib\net40\Swashbuckle.Core.dll + True + + ..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll True @@ -108,12 +117,20 @@ ..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll True + + ..\packages\Microsoft.AspNet.WebApi.WebHost.4.0.30506.0\lib\net40\System.Web.Http.WebHost.dll + True + + + ..\packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll + True + ..\packages\YamlDotNet.3.8.0\lib\net35\YamlDotNet.dll True @@ -199,6 +216,7 @@ + @@ -210,6 +228,10 @@ + + + + @@ -226,7 +248,6 @@ - @@ -234,7 +255,6 @@ - @@ -245,7 +265,6 @@ - @@ -302,7 +321,6 @@ - @@ -310,6 +328,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -363,7 +430,6 @@ - @@ -407,6 +473,7 @@ + @@ -416,6 +483,7 @@ Resources.Designer.cs + diff --git a/Fr8Infrastructure.NET/LICENSE b/Fr8Infrastructure.NET/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Fr8Infrastructure.NET/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Fr8Infrastructure.NET/PhoneNumberVerificationDTO.cs b/Fr8Infrastructure.NET/PhoneNumberVerificationDTO.cs index c958a4b114..9d68abc6cc 100644 --- a/Fr8Infrastructure.NET/PhoneNumberVerificationDTO.cs +++ b/Fr8Infrastructure.NET/PhoneNumberVerificationDTO.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using System; +using Newtonsoft.Json; namespace Fr8.Infrastructure { @@ -6,7 +7,7 @@ public class PhoneNumberVerificationDTO { [JsonProperty("terminalId")] - public int TerminalId { get; set; } + public Guid TerminalId { get; set; } [JsonProperty("terminalName")] public string TerminalName { get; set; } diff --git a/Fr8Infrastructure.NET/Utilities/TypeSafeEnum.cs b/Fr8Infrastructure.NET/Utilities/TypeSafeEnum.cs deleted file mode 100644 index 3a98ab001c..0000000000 --- a/Fr8Infrastructure.NET/Utilities/TypeSafeEnum.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Shnexy.Utilities -{ - - - // E is the derived type-safe-enum class - // - this allows all static members to be truly unique to the specific - // derived class - // from http://stackoverflow.com/questions/424366/c-sharp-string-enums/424414#424414 - public class EnumBase where E : EnumBase - { - #region Instance code - public T Value { get; private set; } - public string Name { get; private set; } - - protected EnumBase(T EnumValue, string Name) - { - Value = EnumValue; - this.Name = Name; - mapping.Add(Name, this); - } - - public override string ToString() { return Name; } - #endregion - - #region Static tools - static private readonly Dictionary> mapping; - static EnumBase() - { - mapping = new Dictionary>(); - } - protected static E Parse(string name) - { - EnumBase result; - if (mapping.TryGetValue(name, out result)) - { - return (E)result; - } - - throw new InvalidCastException(); - } - // This is protected to force the child class to expose it's own static - // method. - // By recreating this static method at the derived class, static - // initialization will be explicit, promising the mapping dictionary - // will never be empty when this method is called. - protected static IEnumerable All - { - get - { - return mapping.Values.AsEnumerable().Cast(); - } - } - #endregion - } - - public sealed class CallRequestStatus : EnumBase - { - public static readonly CallRequestStatus ACTIVE = new CallRequestStatus(1, "ACTIVE"); - public static readonly CallRequestStatus FULFILLED = new CallRequestStatus(2, "FULFILLED"); - public static readonly CallRequestStatus DEACTIVATED = new CallRequestStatus(3, "DEACTIVATED"); - - private CallRequestStatus(int Value, String Name) : base(Value, Name) { } - public new static IEnumerable All - { - get - { return EnumBase.All; } - } - - public static explicit operator CallRequestStatus(string str) - { return Parse(str); } - } - - public sealed class ParticipantType : EnumBase - { - public static readonly ParticipantType PRODUCER = new ParticipantType(1, "PRODUCER"); - public static readonly ParticipantType CONSUMER = new ParticipantType(2, "CONSUMER"); - - - private ParticipantType(int Value, String Name) : base(Value, Name) { } - public new static IEnumerable All - { get { return EnumBase.All; } } - - public static explicit operator ParticipantType(string str) - { return Parse(str); } - - - - } - - public sealed class MessageState - { - private readonly String name; - private readonly int value; - - - public static readonly MessageState UNSENT = new MessageState(1, "UNSENT"); - public static readonly MessageState SENT = new MessageState(2, "SENT"); - - - private MessageState(int value, String name) - { - this.name = name; - this.value = value; - - } - - public override String ToString() - { - return name; - } - - - - } - - public sealed class Method : EnumBase - { - public static readonly Method GET = new Method(1, "GET"); - public static readonly Method POST = new Method(2, "POST"); - public static readonly Method PUT = new Method(2, "PUT"); - - private Method(int Value, String Name) : base(Value, Name) { } - public new static IEnumerable All - { - get - { return EnumBase.All; } - } - - public static explicit operator Method(string str) - { return Parse(str); } - - - - } -} \ No newline at end of file diff --git a/Fr8Infrastructure.NET/app.config b/Fr8Infrastructure.NET/app.config index 860d45df2c..d7e8682ef0 100644 --- a/Fr8Infrastructure.NET/app.config +++ b/Fr8Infrastructure.NET/app.config @@ -10,6 +10,14 @@ + + + + + + + + diff --git a/Fr8Infrastructure.NET/packages.config b/Fr8Infrastructure.NET/packages.config index ad80504cfb..3645fd94c9 100644 --- a/Fr8Infrastructure.NET/packages.config +++ b/Fr8Infrastructure.NET/packages.config @@ -5,15 +5,20 @@ + + + + + \ No newline at end of file diff --git a/Fr8TerminalBase.NET/BaseClasses/DefaultTerminalController.cs b/Fr8TerminalBase.NET/BaseClasses/DefaultTerminalController.cs index fd84964223..df04a5ff15 100644 --- a/Fr8TerminalBase.NET/BaseClasses/DefaultTerminalController.cs +++ b/Fr8TerminalBase.NET/BaseClasses/DefaultTerminalController.cs @@ -3,6 +3,10 @@ using System.Web.Http.Description; using Fr8.Infrastructure.Data.Manifests; using Fr8.TerminalBase.Services; +using Newtonsoft.Json.Serialization; +using System.Collections.Generic; +using System; +using Newtonsoft.Json; namespace Fr8.TerminalBase.BaseClasses { @@ -40,7 +44,16 @@ public IHttpActionResult Get() _hubDiscovery.SetHubSecret(hubUrl, secret); } - return Json(curStandardFr8TerminalCM); + return Json(curStandardFr8TerminalCM, new JsonSerializerSettings() { ContractResolver = new ExcludeTerminalContractResolver() }); + } + + public class ExcludeTerminalContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver + { + protected override IList CreateProperties(Type type, Newtonsoft.Json.MemberSerialization memberSerialization) + { + IList properties = base.CreateProperties(type, memberSerialization); + return properties.Where(p => p.PropertyName != "terminal").ToList(); + } } } } diff --git a/Fr8TerminalBase.NET/Fr8TerminalBase.NET.csproj b/Fr8TerminalBase.NET/Fr8TerminalBase.NET.csproj index 9af33dec66..a5466f7d61 100644 --- a/Fr8TerminalBase.NET/Fr8TerminalBase.NET.csproj +++ b/Fr8TerminalBase.NET/Fr8TerminalBase.NET.csproj @@ -165,6 +165,7 @@ + diff --git a/Fr8TerminalBase.NET/Infrastructure/ValidationExtensions.cs b/Fr8TerminalBase.NET/Infrastructure/ValidationExtensions.cs index 0b868743b0..1ee340b8c6 100644 --- a/Fr8TerminalBase.NET/Infrastructure/ValidationExtensions.cs +++ b/Fr8TerminalBase.NET/Infrastructure/ValidationExtensions.cs @@ -7,6 +7,33 @@ namespace Fr8.TerminalBase.Infrastructure { public static class ValidationExtensions { + public static void ValidateTransitions(this ValidationManager validationManager, ContainerTransition control) + { + for (var i = 0; i < control.Transitions.Count; i++) + { + var transition = control.Transitions[i]; + if (transition.Transition.RequiresTargetNodeId() && transition.TargetNodeId == null) + { + validationManager.SetError(GetMissingNodeTransitionErrorMessage(transition.Transition), $"transition_{i}"); + } + } + } + + private static string GetMissingNodeTransitionErrorMessage(ContainerTransitions transition) + { + switch (transition) + { + case ContainerTransitions.JumpToActivity: + return "Target activity is not specified"; + case ContainerTransitions.LaunchAdditionalPlan: + return "Target plan is not specified"; + case ContainerTransitions.JumpToSubplan: + return "Target subplan is not specified"; + default: + return string.Empty; + } + } + public static void ValidateEmail(this ValidationManager validationManager, IConfigRepository configRepository, ControlDefinitionDTO control, string errorMessage = null) { if (!RegexUtilities.IsValidEmailAddress(configRepository, control.Value)) @@ -42,7 +69,6 @@ public static bool ValidatePhoneNumber(this ValidationManager validationManager, validationManager.SetError(control.InitialLabel + " Is Invalid", control); return false; } - } catch (NumberParseException npe) { diff --git a/Fr8TerminalBase.NET/Interfaces/IHubCommunicator.cs b/Fr8TerminalBase.NET/Interfaces/IHubCommunicator.cs index caba4c6c16..e215474e43 100644 --- a/Fr8TerminalBase.NET/Interfaces/IHubCommunicator.cs +++ b/Fr8TerminalBase.NET/Interfaces/IHubCommunicator.cs @@ -22,7 +22,7 @@ public interface IHubCommunicator Task> GetCratesByDirection(Guid activityId, CrateDirection direction); Task CreateAlarm(AlarmDTO alarmDTO); Task> GetActivityTemplates(bool getLatestsVersionsOnly = false); - Task> GetActivityTemplates(ActivityCategory category, bool getLatestsVersionsOnly = false); + Task> GetActivityTemplates(Guid category, bool getLatestsVersionsOnly = false); Task> GetActivityTemplates(string tag, bool getLatestsVersionsOnly = false); //Task> ValidateFields(List fields); Task ScheduleEvent(string externalAccountId, string minutes, bool triggerImmediately = false, string additionalConfigAttributes = null, string additionToJobId = null); diff --git a/Fr8TerminalBase.NET/LICENSE b/Fr8TerminalBase.NET/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Fr8TerminalBase.NET/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Fr8TerminalBase.NET/Models/AuthorizationToken.cs b/Fr8TerminalBase.NET/Models/AuthorizationToken.cs index 9cf83cb9a7..3179dba55c 100644 --- a/Fr8TerminalBase.NET/Models/AuthorizationToken.cs +++ b/Fr8TerminalBase.NET/Models/AuthorizationToken.cs @@ -16,6 +16,6 @@ public class AuthorizationToken public string Error { get; set; } public bool AuthCompletedNotificationRequired { get; set; } public DateTime? ExpiresAt { get; set; } - public int TerminalID { get; set; } + public Guid TerminalID { get; set; } } } diff --git a/Fr8TerminalBase.NET/Services/ActivityStore.cs b/Fr8TerminalBase.NET/Services/ActivityStore.cs index 08d2e2177d..b0d8e2126d 100644 --- a/Fr8TerminalBase.NET/Services/ActivityStore.cs +++ b/Fr8TerminalBase.NET/Services/ActivityStore.cs @@ -24,8 +24,6 @@ public class ActivityStore : IActivityStore public ActivityStore(TerminalDTO terminal) { Terminal = terminal; - - Terminal.PublicIdentifier = CloudConfigurationManager.GetSetting("TerminalId") ?? ConfigurationManager.AppSettings[terminal.Name + "TerminalId"]; } public void RegisterActivity(ActivityTemplateDTO activityTemplate, IActivityFactory activityFactory) diff --git a/Fr8TerminalBase.NET/Services/DataHubCommunicatorBase.cs b/Fr8TerminalBase.NET/Services/DataHubCommunicatorBase.cs index 42a797b4b3..3a95d845ab 100644 --- a/Fr8TerminalBase.NET/Services/DataHubCommunicatorBase.cs +++ b/Fr8TerminalBase.NET/Services/DataHubCommunicatorBase.cs @@ -157,11 +157,11 @@ public Task> GetActivityTemplates(bool getLatestsVersi return Task.FromResult(activityTemplates); } - public async Task> GetActivityTemplates(ActivityCategory category, bool getLatestsVersionsOnly = false) + public async Task> GetActivityTemplates(Guid category, bool getLatestsVersionsOnly = false) { var allTemplates = await GetActivityTemplates(); var activityTemplates = allTemplates - .Where(x => x.Category == category) + .Where(x => x.Categories.Any(y => y.Id == category)) .ToList(); return activityTemplates; diff --git a/Fr8TerminalBase.NET/Services/DefaultHubCommunicator.cs b/Fr8TerminalBase.NET/Services/DefaultHubCommunicator.cs index 9a2419ea87..5465822a21 100644 --- a/Fr8TerminalBase.NET/Services/DefaultHubCommunicator.cs +++ b/Fr8TerminalBase.NET/Services/DefaultHubCommunicator.cs @@ -136,10 +136,10 @@ public async Task> GetActivityTemplates(bool getLatest return getLatestsVersionsOnly ? GetLatestsVersionsOnly(templates) : templates.ToList(); } - public async Task> GetActivityTemplates(ActivityCategory category, bool getLatestsVersionsOnly = false) + public async Task> GetActivityTemplates(Guid category, bool getLatestsVersionsOnly = false) { var allTemplates = await GetActivityTemplates(getLatestsVersionsOnly); - var templates = allTemplates.Where(x => x.Category == category); + var templates = allTemplates.Where(x => x.Categories.Any(y => y.Id == category)); return templates.ToList(); } diff --git a/Fr8TerminalBase.NET/Services/DummyHubCommunicator.cs b/Fr8TerminalBase.NET/Services/DummyHubCommunicator.cs index d499e7ff23..81b7db99ce 100644 --- a/Fr8TerminalBase.NET/Services/DummyHubCommunicator.cs +++ b/Fr8TerminalBase.NET/Services/DummyHubCommunicator.cs @@ -61,7 +61,7 @@ public Task> GetActivityTemplates(bool getLatestsVersi throw new NotImplementedException("Terminals can't communicate with an unknown hub"); } - public Task> GetActivityTemplates(ActivityCategory category, bool getLatestsVersionsOnly = false) + public Task> GetActivityTemplates(Guid category, bool getLatestsVersionsOnly = false) { throw new NotImplementedException("Terminals can't communicate with an unknown hub"); } diff --git a/Fr8TerminalBase.NET/Services/HubDiscoveryService.cs b/Fr8TerminalBase.NET/Services/HubDiscoveryService.cs index 8ded935917..59462b99cc 100644 --- a/Fr8TerminalBase.NET/Services/HubDiscoveryService.cs +++ b/Fr8TerminalBase.NET/Services/HubDiscoveryService.cs @@ -222,7 +222,7 @@ private async Task SubsribeToHubTask(string hubUrl) } catch (Exception ex) { - Logger.Error($"Failed to add hub '{hubUrl}' to the subscription list of terminal {_activityStore.Terminal.Name} ({_activityStore.Terminal.PublicIdentifier})", ex); + Logger.Error($"Failed to add hub '{hubUrl}' to the subscription list of terminal {_activityStore.Terminal.Name} ({_activityStore.Terminal.Version})", ex); } } @@ -247,7 +247,7 @@ await masterHubCommunicator.DeleteFromWarehouse(new List _restfulServiceClient.PostAsync(new Uri(string.Concat(hubUrl, _apiSuffix, "/terminals/forceDiscover")), _activityStore.Terminal.Endpoint, (string) null)); + var response = await _hubDiscoveryRetryPolicy.Do(() => _restfulServiceClient.PostAsync(new Uri(string.Concat(hubUrl, _apiSuffix, "/terminals/forceDiscover")), _activityStore.Terminal, (string) null)); if (!string.IsNullOrWhiteSpace(response?.ErrorCode)) { @@ -281,7 +281,7 @@ private async Task RequestDiscoveryTask(string hubUrl) if (_hubSecrets.TryGetValue(hubUrl, out setSecretTask)) { - Logger.Error($"Hub at '{hubUrl}' refused to call terminal discovery endpoint: {lastException.Message}"); + Logger.Error($"Terminal {_activityStore.Terminal.Name}({_activityStore.Terminal.Version}): Hub at '{hubUrl}' refused to call terminal discovery endpoint: {lastException.Message}"); setSecretTask.TrySetException(new Exception($"Failed to request discovery from the Hub at : {hubUrl}", lastException)); } } @@ -303,13 +303,13 @@ private async Task RequestDiscoveryTask(string hubUrl) if (_hubSecrets.TryGetValue(hubUrl, out setSecretTask)) { - shouldUnubscribe = setSecretTask.TrySetException(new Exception($"Hub '{hubUrl}' failed to respond with discovery request within a given period of time.")); + shouldUnubscribe = setSecretTask.TrySetException(new Exception($"Terminal { _activityStore.Terminal.Name }({ _activityStore.Terminal.Version}): Hub '{hubUrl}' failed to respond with discovery request within a given period of time.")); } } if (shouldUnubscribe) { - Logger.Error($"Hub at '{hubUrl}'failed to respond with discovery request within a given period of time"); + Logger.Error($"Terminal { _activityStore.Terminal.Name }({ _activityStore.Terminal.Version}): Hub at '{hubUrl}'failed to respond with discovery request within a given period of time"); UnsubscribeFromHub(hubUrl); } }); diff --git a/Fr8TerminalBase.NET/app.config b/Fr8TerminalBase.NET/app.config index 195db1f423..894eceda44 100644 --- a/Fr8TerminalBase.NET/app.config +++ b/Fr8TerminalBase.NET/app.config @@ -6,6 +6,14 @@ + + + + + + + + \ No newline at end of file diff --git a/Global.asax.cs b/Global.asax.cs index f1448d9589..69fd4cc8bf 100644 --- a/Global.asax.cs +++ b/Global.asax.cs @@ -229,7 +229,7 @@ protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) { var claims = principal.Claims; var roles = claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray(); - var userPrincipal = new Fr8Principle(null, principal.Identity, roles); + var userPrincipal = new Fr8Principal(null, principal.Identity, roles); /* GenericPrincipal userPrincipal = new GenericPrincipal(principal.Identity, claims.Where(c => c.Type == ClaimTypes.Role).Select(c => c.Value).ToArray()); diff --git a/Services/PlanDirectory/Interfaces/GenerateMode.cs b/Hub/Enums/GenerateMode.cs similarity index 77% rename from Services/PlanDirectory/Interfaces/GenerateMode.cs rename to Hub/Enums/GenerateMode.cs index 0498a3af09..7a3028b0d3 100644 --- a/Services/PlanDirectory/Interfaces/GenerateMode.cs +++ b/Hub/Enums/GenerateMode.cs @@ -1,4 +1,4 @@ -namespace PlanDirectory.Interfaces +namespace Hub.Enums { public enum GenerateMode { diff --git a/Hub/Exceptions/ActivityExecutionException.cs b/Hub/Exceptions/ActivityExecutionException.cs index 295ee02d89..9a618fce1e 100644 --- a/Hub/Exceptions/ActivityExecutionException.cs +++ b/Hub/Exceptions/ActivityExecutionException.cs @@ -50,11 +50,11 @@ protected virtual string GetErrorMessage() { if (!string.IsNullOrEmpty(Message)) { - return String.Format("Failed to run activity \"{0}\". {1}", FailedActivityDTO?.Name, Message); + return String.Format("Failed to run activity \"{0}\". {1}", FailedActivityDTO?.ActivityTemplate?.Name, Message); } else { - return String.Format("Failed to run activity \"{0}\". Please, make sure it is set up correctly.", FailedActivityDTO?.Name); + return String.Format("Failed to run activity \"{0}\". Please, make sure it is set up correctly.", FailedActivityDTO?.ActivityTemplate?.Name); } } } diff --git a/Hub/Exceptions/ConflictException.cs b/Hub/Exceptions/ConflictException.cs new file mode 100644 index 0000000000..ff27601095 --- /dev/null +++ b/Hub/Exceptions/ConflictException.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Hub.Exceptions +{ + public class ConflictException : Exception + { + public ConflictException(string typeName, string identityName, string identityValue) + : base($"The object of type {typeName} with '{identityName}' equal to '{identityValue}' already exists.") { } + } +} diff --git a/Services/PlanDirectory/Exceptions/ManifestGenerationException.cs b/Hub/Exceptions/ManifestGenerationException.cs similarity index 82% rename from Services/PlanDirectory/Exceptions/ManifestGenerationException.cs rename to Hub/Exceptions/ManifestGenerationException.cs index c36c653a86..b2d544f7f1 100644 --- a/Services/PlanDirectory/Exceptions/ManifestGenerationException.cs +++ b/Hub/Exceptions/ManifestGenerationException.cs @@ -1,6 +1,6 @@ using System; -namespace PlanDirectory.Exceptions +namespace Hub.Exceptions { public class ManifestGenerationException : Exception { diff --git a/Services/PlanDirectory/Exceptions/ManifestNotFoundException.cs b/Hub/Exceptions/ManifestNotFoundException.cs similarity index 85% rename from Services/PlanDirectory/Exceptions/ManifestNotFoundException.cs rename to Hub/Exceptions/ManifestNotFoundException.cs index e5488c3b8e..6884af9e40 100644 --- a/Services/PlanDirectory/Exceptions/ManifestNotFoundException.cs +++ b/Hub/Exceptions/ManifestNotFoundException.cs @@ -1,4 +1,4 @@ -namespace PlanDirectory.Exceptions +namespace Hub.Exceptions { public class ManifestNotFoundException : ManifestGenerationException { diff --git a/Services/PlanDirectory/Exceptions/ManifestPageNotFoundException.cs b/Hub/Exceptions/ManifestPageNotFoundException.cs similarity index 86% rename from Services/PlanDirectory/Exceptions/ManifestPageNotFoundException.cs rename to Hub/Exceptions/ManifestPageNotFoundException.cs index b60adfe309..f911d4e0e3 100644 --- a/Services/PlanDirectory/Exceptions/ManifestPageNotFoundException.cs +++ b/Hub/Exceptions/ManifestPageNotFoundException.cs @@ -1,4 +1,4 @@ -namespace PlanDirectory.Exceptions +namespace Hub.Exceptions { public class ManifestPageNotFoundException : ManifestGenerationException { diff --git a/Hub/Helper/PlanMappingHelper.cs b/Hub/Helper/PlanMappingHelper.cs index 672eafee6d..ae744ad40d 100644 --- a/Hub/Helper/PlanMappingHelper.cs +++ b/Hub/Helper/PlanMappingHelper.cs @@ -1,6 +1,7 @@ using System.Linq; using AutoMapper; using Data.Entities; +using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.States; @@ -22,14 +23,13 @@ public static PlanDTO MapPlanToDto(PlanDO curPlanDO) return pntDTO; }).ToList(); - - + var result = new PlanDTO() { Description = curPlanDO.Description, Id = curPlanDO.Id, Name = curPlanDO.Name, - PlanState = curPlanDO.PlanState, + PlanState = PlanState.IntToString(curPlanDO.PlanState), Visibility = new PlanVisibilityDTO() { Hidden = curPlanDO.Visibility.BooleanValue() }, StartingSubPlanId = curPlanDO.StartingSubPlanId, SubPlans = subPlanDTOList, diff --git a/Hub/Hub.csproj b/Hub/Hub.csproj index ec361a90c9..bff73760ea 100644 --- a/Hub/Hub.csproj +++ b/Hub/Hub.csproj @@ -139,6 +139,10 @@ ..\packages\Microsoft.AspNet.Identity.Owin.2.0.1\lib\net45\Microsoft.AspNet.Identity.Owin.dll + + ..\packages\Microsoft.Azure.Search.1.1.2\lib\net45\Microsoft.Azure.Search.dll + True + ..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll @@ -156,6 +160,18 @@ ..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll True + + ..\packages\Microsoft.Rest.ClientRuntime.1.8.1\lib\net45\Microsoft.Rest.ClientRuntime.dll + True + + + ..\packages\Microsoft.Rest.ClientRuntime.Azure.2.5.2\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll + True + + + ..\packages\Microsoft.Spatial.6.13.0\lib\portable-net40+sl5+wp8+win8+wpa\Microsoft.Spatial.dll + True + ..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll @@ -297,11 +313,16 @@ + + + + + @@ -309,15 +330,21 @@ - + + + + + + + @@ -326,6 +353,16 @@ + + ManifestDescriptionTemplate.tt + True + True + + + PlanCategoryTemplate.tt + True + True + @@ -398,6 +435,13 @@ + + + + + + + @@ -408,7 +452,10 @@ + + + @@ -428,6 +475,7 @@ + @@ -445,9 +493,14 @@ + + TextTemplatingFilePreprocessor + PlanCategoryTemplate.cs + Designer + Designer @@ -459,12 +512,15 @@ + + TextTemplatingFilePreprocessor + ManifestDescriptionTemplate.cs + - diff --git a/Hub/Infrastructure/Fr8Principle.cs b/Hub/Infrastructure/Fr8Principal.cs similarity index 67% rename from Hub/Infrastructure/Fr8Principle.cs rename to Hub/Infrastructure/Fr8Principal.cs index cbec0eb386..447cbeadf4 100644 --- a/Hub/Infrastructure/Fr8Principle.cs +++ b/Hub/Infrastructure/Fr8Principal.cs @@ -2,11 +2,11 @@ namespace Hub.Infrastructure { - public class Fr8Principle : GenericPrincipal + public class Fr8Principal : GenericPrincipal { private string TerminalId { get; set; } - public Fr8Principle(string terminalId, IIdentity identity, string[] roles = null) : base(identity, roles) + public Fr8Principal(string terminalId, IIdentity identity, string[] roles = null) : base(identity, roles) { TerminalId = terminalId; } diff --git a/Hub/Interfaces/IActivityTemplate.cs b/Hub/Interfaces/IActivityTemplate.cs index 3c0e067d96..e34ca456bb 100644 --- a/Hub/Interfaces/IActivityTemplate.cs +++ b/Hub/Interfaces/IActivityTemplate.cs @@ -20,6 +20,6 @@ public interface IActivityTemplate ActivityTemplateDO GetByName(IUnitOfWork uow, string name); ActivityTemplateDO GetByNameAndVersion(string name, string version); // string AssemblePluginRegistrationName(ActivityTemplateDO curActivityTemplateDO); - void RemoveInactiveActivities(List activityTemplateDO); + void RemoveInactiveActivities(TerminalDO terminal, List activityTemplateDO); } } diff --git a/Hub/Interfaces/IAuthorization.cs b/Hub/Interfaces/IAuthorization.cs index ae8d831bd5..f9e11a86dc 100644 --- a/Hub/Interfaces/IAuthorization.cs +++ b/Hub/Interfaces/IAuthorization.cs @@ -36,7 +36,7 @@ Task AuthenticateInternal(Fr8AccountDO account, TerminalDO void RevokeToken(string accountId, Guid authTokenId); - bool TryAssignAuthToken(IUnitOfWork uow, string userId, int terminalId, ActivityDO activityDO, + bool TryAssignAuthToken(IUnitOfWork uow, string userId, Guid terminalId, ActivityDO activityDO, out AuthorizationTokenDO curAuthToken); /// diff --git a/Services/PlanDirectory/Interfaces/IManifestPageGenerator.cs b/Hub/Interfaces/IManifestPageGenerator.cs similarity index 81% rename from Services/PlanDirectory/Interfaces/IManifestPageGenerator.cs rename to Hub/Interfaces/IManifestPageGenerator.cs index 40ae0c074e..967fa69cd9 100644 --- a/Services/PlanDirectory/Interfaces/IManifestPageGenerator.cs +++ b/Hub/Interfaces/IManifestPageGenerator.cs @@ -1,7 +1,8 @@ using System; using System.Threading.Tasks; +using Hub.Enums; -namespace PlanDirectory.Interfaces +namespace Hub.Interfaces { public interface IManifestPageGenerator { diff --git a/Hub/Interfaces/IPlan.cs b/Hub/Interfaces/IPlan.cs index 6667f5860c..134abc1d7d 100644 --- a/Hub/Interfaces/IPlan.cs +++ b/Hub/Interfaces/IPlan.cs @@ -27,8 +27,8 @@ public interface IPlan PlanDO GetPlanByActivityId(IUnitOfWork uow, Guid planActivityId); List MatchEvents(List curPlans, EventReportCM curEventReport); bool IsMonitoringPlan(IUnitOfWork uow, PlanDO planDo); + bool IsPlanActiveOrExecuting(Guid planNodeId); int? GetPlanState(IUnitOfWork uow, Guid planNodeId); - void Enqueue(Guid curPlanId, params Crate[] curEventReport); Task Run(Guid planId, Crate[] payload, Guid? containerId); PlanDO Clone(Guid planId); diff --git a/Hub/Interfaces/IPlanDirectoryService.cs b/Hub/Interfaces/IPlanDirectoryService.cs index 254fa894f2..b54fa76501 100644 --- a/Hub/Interfaces/IPlanDirectoryService.cs +++ b/Hub/Interfaces/IPlanDirectoryService.cs @@ -6,22 +6,9 @@ namespace Hub.Interfaces { public interface IPlanDirectoryService { - /// - /// Get token for user authentication from Plan Directory - /// - /// User who will be authenticated in PD - /// - Task GetToken(string UserId); - - /// - /// Get url for logging out - /// - /// url string - string LogOutUrl(); - Task GetTemplate(Guid id, string userId); Task Share(Guid planId, string userId); - Task Unpublish(Guid planId, string userId); + Task Unpublish(Guid planId, string userId, bool privileged); PlanDTO CrateTemplate(Guid planId, string userId); PlanNoChildrenDTO CreateFromTemplate(PlanDTO plan, string userId); } diff --git a/Services/PlanDirectory/Interfaces/IPlanTemplate.cs b/Hub/Interfaces/IPlanTemplate.cs similarity index 93% rename from Services/PlanDirectory/Interfaces/IPlanTemplate.cs rename to Hub/Interfaces/IPlanTemplate.cs index b82033e378..e03d98a9b3 100644 --- a/Services/PlanDirectory/Interfaces/IPlanTemplate.cs +++ b/Hub/Interfaces/IPlanTemplate.cs @@ -3,7 +3,7 @@ using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.Manifests; -namespace PlanDirectory.Interfaces +namespace Hub.Interfaces { public interface IPlanTemplate { diff --git a/Services/PlanDirectory/Interfaces/ISearchProvider.cs b/Hub/Interfaces/ISearchProvider.cs similarity index 78% rename from Services/PlanDirectory/Interfaces/ISearchProvider.cs rename to Hub/Interfaces/ISearchProvider.cs index cc78184da3..f92b942aee 100644 --- a/Services/PlanDirectory/Interfaces/ISearchProvider.cs +++ b/Hub/Interfaces/ISearchProvider.cs @@ -1,8 +1,9 @@ using System; using System.Threading.Tasks; +using Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory; using Fr8.Infrastructure.Data.Manifests; -namespace PlanDirectory.Interfaces +namespace Hub.Interfaces { public interface ISearchProvider { diff --git a/Hub/Interfaces/ITagGenerator.cs b/Hub/Interfaces/ITagGenerator.cs new file mode 100644 index 0000000000..897cd9e2c2 --- /dev/null +++ b/Hub/Interfaces/ITagGenerator.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Fr8.Infrastructure.Data.Manifests; +using Hub.Services.PlanDirectory; + +namespace Hub.Interfaces +{ + public interface ITagGenerator + { + Task GetTags(PlanTemplateCM planTemplateCM, string fr8AccountId); + } +} \ No newline at end of file diff --git a/Services/PlanDirectory/Interfaces/ITemplateGenerator.cs b/Hub/Interfaces/ITemplateGenerator.cs similarity index 91% rename from Services/PlanDirectory/Interfaces/ITemplateGenerator.cs rename to Hub/Interfaces/ITemplateGenerator.cs index 8b754be6a4..537a94ac81 100644 --- a/Services/PlanDirectory/Interfaces/ITemplateGenerator.cs +++ b/Hub/Interfaces/ITemplateGenerator.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace PlanDirectory.Interfaces +namespace Hub.Interfaces { public interface ITemplateGenerator { diff --git a/Hub/Interfaces/ITerminal.cs b/Hub/Interfaces/ITerminal.cs index 2fc6145cde..fea8cc9878 100644 --- a/Hub/Interfaces/ITerminal.cs +++ b/Hub/Interfaces/ITerminal.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using Data.Entities; using System.Threading.Tasks; @@ -9,9 +10,9 @@ public interface ITerminal { IEnumerable GetAll(); Task> GetAvailableActivities(string uri); - TerminalDO GetByKey(int terminalId); + TerminalDO GetByKey(Guid terminalId); TerminalDO GetByNameAndVersion(string name, string version); - TerminalDO RegisterOrUpdate(TerminalDO terminalDo); + TerminalDO RegisterOrUpdate(TerminalDO terminalDo, bool isDiscovery); Dictionary GetRequestHeaders(TerminalDO terminal, string userId); Task GetByToken(string token); Task> GetSolutionDocumentations(string terminalName); diff --git a/Hub/Interfaces/ITerminalDiscoveryService.cs b/Hub/Interfaces/ITerminalDiscoveryService.cs index 5481a7880b..d6386d51e3 100644 --- a/Hub/Interfaces/ITerminalDiscoveryService.cs +++ b/Hub/Interfaces/ITerminalDiscoveryService.cs @@ -1,11 +1,12 @@ +using Fr8.Infrastructure.Data.DataTransferObjects; using System.Threading.Tasks; namespace Hub.Interfaces { public interface ITerminalDiscoveryService { - Task Discover(); - Task Discover(string terminalUrl); - Task RegisterTerminal(string endpoint); + Task DiscoverAll(); + Task Discover(string terminalUrl, bool isUserInitiated); + Task SaveOrRegister(TerminalDTO terminal); } } \ No newline at end of file diff --git a/Services/PlanDirectory/Interfaces/IWebservicesPageGenerator.cs b/Hub/Interfaces/IWebservicesPageGenerator.cs similarity index 85% rename from Services/PlanDirectory/Interfaces/IWebservicesPageGenerator.cs rename to Hub/Interfaces/IWebservicesPageGenerator.cs index e98c64bf9f..a4be053be9 100644 --- a/Services/PlanDirectory/Interfaces/IWebservicesPageGenerator.cs +++ b/Hub/Interfaces/IWebservicesPageGenerator.cs @@ -1,7 +1,7 @@ using System.Threading.Tasks; using Fr8.Infrastructure.Data.Manifests; -namespace PlanDirectory.Interfaces +namespace Hub.Interfaces { public interface IWebservicesPageGenerator { diff --git a/Hub/LICENSE b/Hub/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Hub/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Hub/Managers/EventReporter.cs b/Hub/Managers/EventReporter.cs index 45cb522213..67de5b621f 100644 --- a/Hub/Managers/EventReporter.cs +++ b/Hub/Managers/EventReporter.cs @@ -159,27 +159,26 @@ private void ActivityRunRequested(ActivityDO activityDo, ContainerDO containerDO ObjectId = activityDo.Id.ToString(), Fr8UserId = _security.GetCurrentUser(), CreatedByID = _security.GetCurrentUser(), - Data = string.Join( Environment.NewLine, "Activity Name: " + template?.Name) + Data = string.Join(Environment.NewLine, "Activity Name: " + template?.Name) }; var planDO = uow.PlanRepository.GetById(activityDo.RootPlanNodeId); planId = planDO.Id; planLastUpdated = planDO.LastUpdated; - SaveAndLogFact(factDO); + //create user notifications + var _pusherNotifier = ObjectFactory.GetInstance(); + _pusherNotifier.NotifyUser(new NotificationPlanDTO + { + NotificationType = NotificationType.GenericInfo, + Subject = "Executing Activity", + Message = "For Plan: " + containerDO.Name + "\nContainer: " + containerDO.Id.ToString(), + ActivityName = template.Label, + PlanId = planId, + PlanLastUpdated = planLastUpdated, + Collapsed = true, + }, activityDo.Fr8Account.Id); } - - //create user notifications - var _pusherNotifier = ObjectFactory.GetInstance(); - _pusherNotifier.NotifyUser(new NotificationPlanDTO - { - NotificationType = NotificationType.GenericInfo, - Message = "For Plan: " + containerDO.Name + "\nContainer: " + containerDO.Id.ToString(), - ActivityName = activityDo.Name, - PlanId = planId, - PlanLastUpdated = planLastUpdated, - Collapsed = true, - }, activityDo.Fr8Account.Id); } catch (Exception exception) { diff --git a/Services/PlanDirectory/ManifestPages/ManifestDescriptionTemplate.cs b/Hub/Resources/ManifestDescriptionTemplate.cs similarity index 92% rename from Services/PlanDirectory/ManifestPages/ManifestDescriptionTemplate.cs rename to Hub/Resources/ManifestDescriptionTemplate.cs index 1be610cea7..51d48b8dab 100644 --- a/Services/PlanDirectory/ManifestPages/ManifestDescriptionTemplate.cs +++ b/Hub/Resources/ManifestDescriptionTemplate.cs @@ -7,16 +7,16 @@ // the code is regenerated. // // ------------------------------------------------------------------------------ -namespace PlanDirectory.ManifestPages + +using Newtonsoft.Json; + +namespace Hub.Resources { - using Newtonsoft.Json; - using System; - /// /// Class to produce the template output /// - #line 1 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 1 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "14.0.0.0")] public partial class ManifestDescriptionTemplate : ManifestDescriptionTemplateBase { @@ -27,7 +27,7 @@ public partial class ManifestDescriptionTemplate : ManifestDescriptionTemplateBa public virtual string TransformText() { - #line 6 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 6 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" var manifestName = Manifests[0].Name; #line default @@ -46,7 +46,7 @@ public virtual string TransformText() Fr8 - "); - #line 19 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 19 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(manifestName)); #line default @@ -56,14 +56,14 @@ public virtual string TransformText() " </div>\r\n </div>\r\n <div class=\"container\">\r\n <h1>Manifest - <" + "em>"); - #line 29 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 29 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(manifestName)); #line default #line hidden this.Write("</em></h1>\r\n\t\t"); - #line 30 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 30 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" foreach (var manifest in Manifests) { @@ -73,14 +73,14 @@ public virtual string TransformText() "hr />\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n " + " <div class=\"col-md-12\">\r\n <h3>V"); - #line 39 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 39 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(manifest.Version)); #line default #line hidden this.Write(" Registered By "); - #line 39 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 39 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(manifest.RegisteredBy)); #line default @@ -88,7 +88,7 @@ public virtual string TransformText() this.Write("</h3>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n " + " <div class=\"col-md-12\">\r\n <p>\r\n <em>"); - #line 45 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 45 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(manifest.Description)); #line default @@ -97,7 +97,7 @@ public virtual string TransformText() "ss=\"row\">\r\n <div class=\"col-md-12\">\r\n <strong>Sample J" + "SON</strong>\r\n </div>\r\n </div>\r\n\t\t"); - #line 54 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 54 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" var resultJson = manifest.SampleJSON; try @@ -115,14 +115,14 @@ public virtual string TransformText() this.Write(" <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <" + "pre>\r\n"); - #line 68 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 68 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(resultJson)); #line default #line hidden this.Write("\r\n </pre>\r\n </div>\r\n </div>\r\n\t\t"); - #line 72 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 72 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" } #line default @@ -131,7 +131,7 @@ public virtual string TransformText() return this.GenerationEnvironment.ToString(); } - #line 1 "E:\GitHub\Fr8Core\Services\PlanDirectory\ManifestPages\ManifestDescriptionTemplate.tt" + #line 1 "C:\dev\Work\fr8company\ManifestPages\ManifestDescriptionTemplate.tt" private global::System.Collections.Generic.IList<Fr8.Infrastructure.Data.Manifests.ManifestDescriptionCM> _ManifestsField; diff --git a/Services/PlanDirectory/ManifestPages/ManifestDescriptionTemplate.tt b/Hub/Resources/ManifestDescriptionTemplate.tt similarity index 100% rename from Services/PlanDirectory/ManifestPages/ManifestDescriptionTemplate.tt rename to Hub/Resources/ManifestDescriptionTemplate.tt diff --git a/Services/PlanDirectory/CategoryPages/PlanCategoryTemplate.cs b/Hub/Resources/PlanCategoryTemplate.cs similarity index 92% rename from Services/PlanDirectory/CategoryPages/PlanCategoryTemplate.cs rename to Hub/Resources/PlanCategoryTemplate.cs index 8104ba158d..cf84bf1524 100644 --- a/Services/PlanDirectory/CategoryPages/PlanCategoryTemplate.cs +++ b/Hub/Resources/PlanCategoryTemplate.cs @@ -7,15 +7,14 @@ // the code is regenerated. // </auto-generated> // ------------------------------------------------------------------------------ -namespace PlanDirectory.CategoryPages + +namespace Hub.Resources { - using System; - /// <summary> /// Class to produce the template output /// </summary> - #line 1 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 1 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "14.0.0.0")] public partial class PlanCategoryTemplate : PlanCategoryTemplateBase { @@ -49,14 +48,14 @@ public virtual string TransformText() <div class=""container""> <p style=""font-size: 30px"">Plan Directory - "); - #line 27 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 27 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(Name)); #line default #line hidden this.Write("</p>\r\n <div class=\"icons\">\r\n\t\t\t"); - #line 29 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 29 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" int i = 0; foreach (var tag in Tags) { @@ -65,14 +64,14 @@ public virtual string TransformText() #line hidden this.Write("\t\t\t<img class=\"web-service-icon\" src=\".."); - #line 32 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 32 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(tag.Value)); #line default #line hidden this.Write("\"/>\t\t\r\n\t\t\t\t"); - #line 33 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 33 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" if (i < Tags.Count - 1) { @@ -80,7 +79,7 @@ public virtual string TransformText() #line hidden this.Write("\t\t\t\t<img src=\"../Content/icons/plus.png\"/>\r\n\t\t\t\t"); - #line 36 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 36 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" i++; } @@ -88,7 +87,7 @@ public virtual string TransformText() #line hidden this.Write(" \r\n\t\t"); - #line 38 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 38 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" } #line default @@ -109,7 +108,7 @@ public virtual string TransformText() <tbody> "); - #line 53 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 53 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" int number = 1; foreach (var plan in RelatedPlans) { @@ -118,28 +117,28 @@ public virtual string TransformText() #line hidden this.Write(" <tr>\r\n <th scope=\"row\">"); - #line 57 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 57 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(number++)); #line default #line hidden this.Write("</th>\r\n <td>"); - #line 58 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 58 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(plan.Item1)); #line default #line hidden this.Write("</td>\r\n <td>"); - #line 59 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 59 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(plan.Item2)); #line default #line hidden this.Write("</td>\r\n <td><a href=\""); - #line 60 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 60 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" this.Write(this.ToStringHelper.ToStringWithCulture(plan.Item3)); #line default @@ -147,7 +146,7 @@ public virtual string TransformText() this.Write("\">Create</a></td>\r\n </tr> \r\n " + " "); - #line 62 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 62 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" } #line default @@ -157,7 +156,7 @@ public virtual string TransformText() return this.GenerationEnvironment.ToString(); } - #line 1 "d:\Dev\fr8company\Services\PlanDirectory\CategoryPages\PlanCategoryTemplate.tt" + #line 1 "C:\dev\Work\fr8company\CategoryPages\PlanCategoryTemplate.tt" private string _NameField; diff --git a/Services/PlanDirectory/CategoryPages/PlanCategoryTemplate.tt b/Hub/Resources/PlanCategoryTemplate.tt similarity index 100% rename from Services/PlanDirectory/CategoryPages/PlanCategoryTemplate.tt rename to Hub/Resources/PlanCategoryTemplate.tt diff --git a/Hub/Security/AuthorizeActivityInterceptor.cs b/Hub/Security/AuthorizeActivityInterceptor.cs index 7de80a86b1..1dfafbcb65 100644 --- a/Hub/Security/AuthorizeActivityInterceptor.cs +++ b/Hub/Security/AuthorizeActivityInterceptor.cs @@ -74,20 +74,20 @@ private void AuthorizeMethodInvocation(IInvocation invocation, AuthorizeActivity { foreach (var parameter in MapParameters(invocation.Arguments, invocation.Method.GetParameters(), authorizeAttribute.ParamType)) { - string objectId; + Guid objectId; if (parameter is Guid) { - objectId = parameter.ToString(); + objectId = (Guid)parameter; } else if (parameter is string) { - objectId = (string) parameter; + objectId = Guid.Parse((string)parameter); } else { //todo: in case of requirement for objects not inherited from BaseObject, create a new property inside AuthorizeActivityAttribute that will set object inner propertyName in case of this "Id" var property = parameter.GetType().GetProperty("Id"); - objectId = property.GetValue(parameter).ToString(); + objectId = Guid.Parse(property.GetValue(parameter).ToString()); } if (_securityServices.AuthorizeActivity(authorizeAttribute.Permission, objectId, authorizeAttribute.TargetType.Name)) @@ -115,14 +115,15 @@ private void AuthorizePropertyInvocation(IInvocation invocation, AuthorizeActivi invocation.Proceed(); } - Guid result; + Guid result = Guid.Empty; if (Guid.TryParse(objectId, out result)) { - if(result == Guid.Empty) - invocation.Proceed(); + if(result == Guid.Empty) { + invocation.Proceed(); + } } - if (_securityServices.AuthorizeActivity(authorizeAttribute.Permission, objectId, authorizeAttribute.TargetType.Name)) + if (_securityServices.AuthorizeActivity(authorizeAttribute.Permission, result, authorizeAttribute.TargetType.Name)) { invocation.Proceed(); return; diff --git a/Hub/Security/ObjectDecorators/PlanSecurityDecorator.cs b/Hub/Security/ObjectDecorators/PlanSecurityDecorator.cs index 1dc12f02bb..634d56a9c4 100644 --- a/Hub/Security/ObjectDecorators/PlanSecurityDecorator.cs +++ b/Hub/Security/ObjectDecorators/PlanSecurityDecorator.cs @@ -27,7 +27,7 @@ public PlanSecurityDecorator(IPlan target, ISecurityServices securityServices) public Task<ActivateActivitiesDTO> Activate(Guid planId, bool planBuilderActivate) { - if (_securityServices.AuthorizeActivity(PermissionType.EditObject, planId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.EditObject, planId, nameof(PlanNodeDO))) { return _target.Activate(planId, planBuilderActivate); } @@ -39,7 +39,7 @@ public Task<ActivateActivitiesDTO> Activate(Guid planId, bool planBuilderActivat public PlanDO Clone(Guid planId) { - if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planId, nameof(PlanNodeDO))) { return _target.Clone(planId); } @@ -54,6 +54,11 @@ public bool IsMonitoringPlan(IUnitOfWork uow, PlanDO planDo) return _target.IsMonitoringPlan(uow, planDo); } + public bool IsPlanActiveOrExecuting(Guid planNodeId) + { + return _target.IsPlanActiveOrExecuting(planNodeId); + } + public int? GetPlanState(IUnitOfWork uow, Guid planNodeId) { return _target.GetPlanState(uow, planNodeId); @@ -67,7 +72,7 @@ public PlanDO Create(IUnitOfWork uow, string name, string category = "", string public PlanDO GetFullPlan(IUnitOfWork uow, Guid planId) { - if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planId, nameof(PlanNodeDO))) { return _target.GetFullPlan(uow, planId); } @@ -84,7 +89,7 @@ public void CreateOrUpdate(IUnitOfWork uow, PlanDO submittedPlan) public Task Deactivate(Guid curPlanId) { - if (_securityServices.AuthorizeActivity(PermissionType.EditObject, curPlanId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.EditObject, curPlanId, nameof(PlanNodeDO))) { return _target.Deactivate(curPlanId); } @@ -94,7 +99,7 @@ public Task Deactivate(Guid curPlanId) public async Task Delete(Guid id) { - if (_securityServices.AuthorizeActivity(PermissionType.DeleteObject, id.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.DeleteObject, id, nameof(PlanNodeDO))) { await _target.Delete(id); } @@ -106,7 +111,7 @@ public async Task Delete(Guid id) public void Enqueue(Guid curPlanId, params Crate[] curEventReport) { - if (_securityServices.AuthorizeActivity(PermissionType.EditObject, curPlanId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.EditObject, curPlanId, nameof(PlanNodeDO))) { _target.Enqueue(curPlanId, curEventReport); } @@ -133,7 +138,7 @@ public IList<PlanDO> GetMatchingPlans(string userId, EventReportCM curEventRepor public PlanDO GetPlanByActivityId(IUnitOfWork uow, Guid planActivityId) { - if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planActivityId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.ReadObject, planActivityId, nameof(PlanNodeDO))) { return _target.GetPlanByActivityId(uow, planActivityId); } @@ -150,7 +155,7 @@ public List<PlanDO> MatchEvents(List<PlanDO> curPlans, EventReportCM curEventRep public Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containerId) { - if (_securityServices.AuthorizeActivity(PermissionType.RunObject, planId.ToString(), nameof(PlanNodeDO))) + if (_securityServices.AuthorizeActivity(PermissionType.RunObject, planId, nameof(PlanNodeDO))) { return _target.Run(planId, payload, containerId); } diff --git a/Hub/Security/SecurityServices.cs b/Hub/Security/SecurityServices.cs index c2cd776e96..b93594ea96 100644 --- a/Hub/Security/SecurityServices.cs +++ b/Hub/Security/SecurityServices.cs @@ -144,14 +144,14 @@ public async Task<ClaimsIdentity> GetIdentityAsync(IUnitOfWork uow, Fr8AccountDO #region Permissions Related Methods /// <summary> - /// For every new created object setup default security with permissions for Read Object, Edit Object, Delete Object - /// and Role. For setup ownership to a record use Role OwnerOfCurrentObject + /// For every new created object sets up default security with permissions for Read Object, Edit Object, Delete Object + /// and Role. For set up the ownership to a record use Role OwnerOfCurrentObject /// </summary> /// <param name="roleName">User role</param> /// <param name="dataObjectId"></param> /// <param name="dataObjectType"></param> /// <param name="customPermissionTypes">You can define your own permission types for a object, or use default permission set for Standard Users</param> - public void SetDefaultRecordBasedSecurityForObject(string roleName, string dataObjectId, string dataObjectType, List<PermissionType> customPermissionTypes = null) + public void SetDefaultRecordBasedSecurityForObject(string roleName, Guid dataObjectId, string dataObjectType, List<PermissionType> customPermissionTypes = null) { if (!IsAuthenticated()) return; @@ -172,7 +172,7 @@ public void SetDefaultRecordBasedSecurityForObject(string roleName, string dataO if (orgId != 0) organizationId = orgId; } - _securityObjectStorageProvider.SetDefaultRecordBasedSecurityForObject(currentUserId, roleName, dataObjectId.ToString(), dataObjectType, Guid.Empty, organizationId, customPermissionTypes); + _securityObjectStorageProvider.SetDefaultRecordBasedSecurityForObject(currentUserId, roleName, dataObjectId, dataObjectType, Guid.Empty, organizationId, customPermissionTypes); } public IEnumerable<TerminalDO> GetAllowedTerminalsByUser(IEnumerable<TerminalDO> terminals) @@ -180,7 +180,7 @@ public IEnumerable<TerminalDO> GetAllowedTerminalsByUser(IEnumerable<TerminalDO> if (!IsAuthenticated()) return terminals; - if (Thread.CurrentPrincipal is Fr8Principle) + if (Thread.CurrentPrincipal is Fr8Principal) return terminals; var roles = GetRoleNames().ToList(); @@ -188,7 +188,7 @@ public IEnumerable<TerminalDO> GetAllowedTerminalsByUser(IEnumerable<TerminalDO> var allowedTerminals = new List<TerminalDO>(); foreach (var terminal in terminals) { - var objRolePermissionWrapper = _securityObjectStorageProvider.GetRecordBasedPermissionSetForObject(terminal.Id.ToString(), nameof(TerminalDO)); + var objRolePermissionWrapper = _securityObjectStorageProvider.GetRecordBasedPermissionSetForObject(terminal.Id, nameof(TerminalDO)); if (!objRolePermissionWrapper.RolePermissions.Any()) continue; // first check if this user is the owner of the record @@ -218,7 +218,7 @@ public IEnumerable<TerminalDO> GetAllowedTerminalsByUser(IEnumerable<TerminalDO> /// <param name="objectId"></param> /// <param name="objectType"></param> /// <returns></returns> - public List<string> GetAllowedUserRolesForSecuredObject(string objectId, string objectType) + public List<string> GetAllowedUserRolesForSecuredObject(Guid objectId, string objectType) { return _securityObjectStorageProvider.GetAllowedUserRolesForSecuredObject(objectId, objectType); } @@ -232,14 +232,14 @@ public List<string> GetAllowedUserRolesForSecuredObject(string objectId, string /// <param name="curObjectType"></param> /// <param name="propertyName"></param> /// <returns></returns> - public bool AuthorizeActivity(PermissionType permissionType, string curObjectId, string curObjectType, string propertyName = null) + public bool AuthorizeActivity(PermissionType permissionType, Guid curObjectId, string curObjectType, string propertyName = null) { //check if user is authenticated. Unauthenticated users cannot pass security and come up to here, which means this is internal fr8 event, that need to be passed if (!IsAuthenticated()) return true; //check if request came from terminal - if (Thread.CurrentPrincipal is Fr8Principle) + if (Thread.CurrentPrincipal is Fr8Principal) return true; //get all current roles for current user @@ -285,7 +285,7 @@ public bool AuthorizeActivity(PermissionType permissionType, string curObjectId, return EvaluateProfilesPermissionSet(permissionType, permissionSets, fr8AccountId); } - private bool CheckForAppBuilderPlanAndBypassSecurity(string curObjectId, out string fr8AccountId) + private bool CheckForAppBuilderPlanAndBypassSecurity(Guid curObjectId, out string fr8AccountId) { //TODO: @makigjuro temp fix until FR-3008 is implemented //bypass security on AppBuilder plan, because that one is visible for every user that has this url @@ -293,10 +293,7 @@ private bool CheckForAppBuilderPlanAndBypassSecurity(string curObjectId, out str var activityTemplate = ObjectFactory.GetInstance<IActivityTemplate>(); using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { - Guid id; - if (!Guid.TryParse(curObjectId, out id)) return false; - - var planNode = uow.PlanRepository.GetById<PlanNodeDO>(id); + var planNode = uow.PlanRepository.GetById<PlanNodeDO>(curObjectId); fr8AccountId = planNode.Fr8AccountId; var mainPlan = uow.PlanRepository.GetById<PlanDO>(planNode.RootPlanNodeId); if (mainPlan.Visibility == PlanVisibility.Internal) return true; @@ -379,7 +376,7 @@ public bool UserHasPermission(PermissionType permissionType, string objectType) { var permissionSetOrg = (from x in rolePermissions.Where(x => x.Role.RoleName != Roles.OwnerOfCurrentObject) where roles.Contains(x.Role.RoleName) from i in x.PermissionSet.Permissions.Select(m => m.Id) select i).ToList(); - var modifyAllData = permissionSetOrg.FirstOrDefault(x => x == (int)PermissionType.ModifyAllObjects); + var modifyAllData = permissionSetOrg.FirstOrDefault(x => x == (int)PermissionType.EditAllObjects); var viewAllData = permissionSetOrg.FirstOrDefault(x => x == (int)PermissionType.ViewAllObjects); if (viewAllData != 0 && permissionType == PermissionType.ReadObject) return true; if (modifyAllData != 0) return true; @@ -398,7 +395,7 @@ public bool UserHasPermission(PermissionType permissionType, string objectType) return currentPermission != 0; } - var modifyAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.ModifyAllObjects); + var modifyAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.EditAllObjects); var viewAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.ViewAllObjects); if (viewAllData != 0 && permissionType == PermissionType.ReadObject) return true; if (modifyAllData != 0) return true; @@ -447,7 +444,7 @@ private bool EvaluateProfilesPermissionSet(PermissionType permissionType, List<i return currentPermission != 0; } - var modifyAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.ModifyAllObjects); + var modifyAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.EditAllObjects); var viewAllData = permissionSet.FirstOrDefault(x => x == (int)PermissionType.ViewAllObjects); if (viewAllData != 0 && permissionType == PermissionType.ReadObject) return true; if (modifyAllData != 0) return true; diff --git a/Hub/Services/Activity.cs b/Hub/Services/Activity.cs index abab983101..004d7180de 100644 --- a/Hub/Services/Activity.cs +++ b/Hub/Services/Activity.cs @@ -124,7 +124,6 @@ public async Task<PlanNodeDO> CreateAndConfigure(IUnitOfWork uow, string userId, { Id = Guid.NewGuid(), ActivityTemplateId = activityTemplateId, - Name = name, CrateStorage = _crateManager.EmptyStorageAsStr(), AuthorizationTokenId = authorizationTokenId }; @@ -189,9 +188,11 @@ public async Task<ActivityDTO> Activate(ActivityDO submittedActivity) { return Mapper.Map<ActivityDTO>(submittedActivity); } + Logger.GetLogger().Info($"Before calling terminal activation of activity (Id - {submittedActivity.Id})"); var activatedActivityDTO = await CallTerminalActivityAsync<ActivityDTO>(uow, "activate", null, submittedActivity, Guid.Empty); Logger.GetLogger().Info($"Call to terminal activation of activity (Id - {submittedActivity.Id}) completed"); + var activatedActivityDo = Mapper.Map<ActivityDO>(activatedActivityDTO); var storage = _crateManager.GetStorage(activatedActivityDo); var validationCrate = storage.CrateContentsOfType<ValidationResultsCM>().FirstOrDefault(); @@ -558,7 +559,7 @@ private async Task CallActivityDeactivate(IUnitOfWork uow, Guid activityId) var root = exisiting.GetTreeRoot() as PlanDO; - if (root?.PlanState == PlanState.Running) + if (root?.PlanState == PlanState.Executing || root?.PlanState == PlanState.Active) { root.PlanState = PlanState.Inactive; } @@ -700,7 +701,6 @@ public async Task<T> GetActivityDocumentation<T>(ActivityDTO activityDTO, bool i { Id = Guid.NewGuid(), Label = curActivityTerminalDTO.Label, - Name = curActivityTerminalDTO.Name, ActivityTemplate = new ActivityTemplateSummaryDTO { Name = curActivityTerminalDTO.Name, @@ -739,10 +739,12 @@ public List<string> GetSolutionNameList(string terminalName) var solutionNameList = new List<string>(); using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { + var solutionId = ActivityCategories.SolutionId; + var curActivities = uow.ActivityTemplateRepository .GetQuery() .Where(x => x.Terminal.Name == terminalName - && x.Category == Fr8.Infrastructure.Data.States.ActivityCategory.Solution) + && x.Categories.Any(y => y.ActivityCategoryId == solutionId)) .GroupBy(x => x.Name) .AsEnumerable() .Select(x => x.OrderByDescending(y => int.Parse(y.Version)).First()) diff --git a/Hub/Services/ActivityCategory.cs b/Hub/Services/ActivityCategory.cs index 7383a0bf6f..3b4c2dcf17 100644 --- a/Hub/Services/ActivityCategory.cs +++ b/Hub/Services/ActivityCategory.cs @@ -85,35 +85,95 @@ public ActivityCategoryDO RegisterOrUpdate(ActivityCategoryDO activityCategory) { using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { - var categoryNameUpper = activityCategory.Name.ToUpper(CultureInfo.InvariantCulture); - var category = uow.ActivityCategoryRepository + var activityCategoryByName = uow.ActivityCategoryRepository .GetQuery() - .FirstOrDefault(x => x.Name.ToUpper() == categoryNameUpper); + .FirstOrDefault(x => x.Name == activityCategory.Name && x.Id != activityCategory.Id); - if (category == null) + if (activityCategory.Id != Guid.Empty) { - var newActivityCategory = new ActivityCategoryDO() + var activityTemplateAssignments = new List<ActivityTemplateDO>(); + + if (activityCategoryByName != null) + { + var existingAssignments = uow.ActivityCategorySetRepository.GetQuery() + .Where(x => x.ActivityCategoryId == activityCategoryByName.Id) + .ToList(); + + foreach (var assignment in existingAssignments) + { + activityTemplateAssignments.Add(assignment.ActivityTemplate); + uow.ActivityCategorySetRepository.Remove(assignment); + } + uow.SaveChanges(); + + uow.ActivityCategoryRepository.Remove(activityCategoryByName); + uow.SaveChanges(); + } + + var activityCategoryById = uow.ActivityCategoryRepository + .GetQuery() + .FirstOrDefault(x => x.Id == activityCategory.Id); + + if (activityCategoryById == null) + { + activityCategoryById = new ActivityCategoryDO() + { + Id = activityCategory.Id, + Name = activityCategory.Name, + IconPath = activityCategory.IconPath + }; + + uow.ActivityCategoryRepository.Add(activityCategoryById); + } + else { - Id = Guid.NewGuid(), - Name = activityCategory.Name, - IconPath = activityCategory.IconPath - }; + activityCategoryById.IconPath = activityCategory.IconPath; + } + + foreach (var assignedActivityTemplate in activityTemplateAssignments) + { + uow.ActivityCategorySetRepository.Add( + new ActivityCategorySetDO() + { + Id = Guid.NewGuid(), + ActivityCategoryId = activityCategory.Id, + ActivityCategory = activityCategory, + ActivityTemplateId = assignedActivityTemplate.Id, + ActivityTemplate = assignedActivityTemplate + } + ); + } + + _activityCategories[activityCategoryById.Id] = Clone(activityCategoryById); - uow.ActivityCategoryRepository.Add(newActivityCategory); uow.SaveChanges(); - category = newActivityCategory; + return activityCategoryById; } else { - category.Name = activityCategory.Name; - category.IconPath = activityCategory.IconPath; - uow.SaveChanges(); - } + if (activityCategoryByName == null) + { + activityCategoryByName = new ActivityCategoryDO() + { + Id = Guid.NewGuid(), + Name = activityCategory.Name, + IconPath = activityCategory.IconPath + }; + + uow.ActivityCategoryRepository.Add(activityCategoryByName); + } + else + { + activityCategoryByName.IconPath = activityCategory.IconPath; + } - _activityCategories[category.Id] = Clone(category); + _activityCategories[activityCategoryByName.Id] = Clone(activityCategoryByName); - return category; + uow.SaveChanges(); + + return activityCategoryByName; + } } } } diff --git a/Hub/Services/ActivityTemplate.cs b/Hub/Services/ActivityTemplate.cs index 519227850a..0b7587cc81 100644 --- a/Hub/Services/ActivityTemplate.cs +++ b/Hub/Services/ActivityTemplate.cs @@ -63,7 +63,6 @@ private void LoadFromDb() using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { var query = uow.ActivityTemplateRepository.GetQuery() - .Include(x => x.WebService) .Include(x => x.Categories) .Include("Categories.ActivityCategory"); foreach (var activityTemplate in query) @@ -178,13 +177,6 @@ private ActivityTemplateDO Clone(ActivityTemplateDO source) CopyPropertiesHelper.CopyProperties(source, newTemplate, false); newTemplate.Terminal = _terminal.GetByKey(source.TerminalId); - if (source.WebService != null) - { - var webService = new WebServiceDO(); - CopyPropertiesHelper.CopyProperties(source.WebService, webService, false); - newTemplate.WebService = webService; - } - if (source.Categories != null) { newTemplate.Categories = new List<ActivityCategorySetDO>(); @@ -207,45 +199,25 @@ private ActivityTemplateDO Clone(ActivityTemplateDO source) return newTemplate; } - public void RemoveInactiveActivities(List<ActivityTemplateDO> activityTemplates) + public void RemoveInactiveActivities(TerminalDO terminal, List<ActivityTemplateDO> activityTemplates) { using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { - //let's first get webservice of those activities - var webService = activityTemplates.FirstOrDefault(a => a.WebService != null)?.WebService; - if (webService == null) - { - //try to load webservice from db - var dummyActivity = activityTemplates.First(); - webService = uow.ActivityTemplateRepository.GetQuery() - .FirstOrDefault(t => t.Name == dummyActivity.Name)? - .WebService; - } - else - { - webService = uow.WebServiceRepository.GetQuery().FirstOrDefault(t => t.Name == webService.Name); - } + var terminalActivitiesToBeRemoved = uow.ActivityTemplateRepository + .GetQuery() + .Where(x => x.TerminalId == terminal.Id) + .AsEnumerable() + .Where(x => !activityTemplates.Any(y => y.Name == x.Name && y.Version == x.Version)) + .ToList(); - //we can't operate without a common webservice for those activities - if (webService == null) + foreach (var activityToRemove in terminalActivitiesToBeRemoved) { - //wow we can't do anything about this - return; + activityToRemove.ActivityTemplateState = ActivityTemplateState.Inactive; + _activityTemplates.Remove(activityToRemove.Id); } - var currentActivityNames = activityTemplates.Select(x => x.Name); - //get activities which we didn't receive as parameter - var inactiveActivities = uow.ActivityTemplateRepository.GetQuery().Where(t => !currentActivityNames.Contains(t.Name) && t.WebServiceId == webService.Id).ToList(); - - //we need to remove those inactiveActivities both from db and cache - foreach (var activityTemplateDO in inactiveActivities) - { - activityTemplateDO.ActivityTemplateState = ActivityTemplateState.Inactive; - _activityTemplates.Remove(activityTemplateDO.Id); - } uow.SaveChanges(); - } - + } } private List<ActivityCategorySetDO> ApplyActivityCategories( @@ -316,16 +288,6 @@ public void RegisterOrUpdate(ActivityTemplateDO activityTemplateDo) throw new ArgumentOutOfRangeException($"ActivityTemplate.Version is not a valid integer value: {activityTemplateDo.Version}"); } - if (activityTemplateDo.WebService == null) - { - throw new ArgumentOutOfRangeException("ActivityTemplate.WebService is not set"); - } - - if (string.IsNullOrWhiteSpace(activityTemplateDo.WebService.Name)) - { - throw new ArgumentOutOfRangeException("ActivityTemplate.WebService.Name can't be empty"); - } - // we are going to change activityTemplateDo. It is not good to corrupt method's input parameters. // make a copy var clone = new ActivityTemplateDO(); @@ -334,14 +296,6 @@ public void RegisterOrUpdate(ActivityTemplateDO activityTemplateDo) clone.Terminal = activityTemplateDo.Terminal; - // Make copy of web-service reference and add it to - if (activityTemplateDo.WebService != null) - { - var wsClone = new WebServiceDO(); - CopyPropertiesHelper.CopyProperties(activityTemplateDo.WebService, wsClone, true); - clone.WebService = wsClone; - } - // Create list of activity categories for current ActivityTemplate. var activityCategories = new List<ActivityCategoryDO>(); if (activityTemplateDo.Categories != null) @@ -363,28 +317,10 @@ public void RegisterOrUpdate(ActivityTemplateDO activityTemplateDo) lock (_activityTemplates) { using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) - { - if (activityTemplateDo.WebService != null) - { - var existingWebService = uow.WebServiceRepository.FindOne(x => x.Name == activityTemplateDo.WebService.Name); - - // Update existing WebService entity. - if (existingWebService != null) - { - existingWebService.IconPath = activityTemplateDo.WebService.IconPath; - activityTemplateDo.WebServiceId = existingWebService.Id; - activityTemplateDo.WebService = existingWebService; - } - else - { - activityTemplateDo.WebService.Id = 0; - activityTemplateDo.WebServiceId = 0; - } - } - + { // Try to extract existing ActivityTemplate. var activity = uow.ActivityTemplateRepository.GetQuery() - .Include(x => x.WebService) + // .Include(x => x.WebService) .FirstOrDefault(t => t.Name == activityTemplateDo.Name && t.TerminalId == activityTemplateDo.TerminalId && t.Version == activityTemplateDo.Version); @@ -408,15 +344,17 @@ public void RegisterOrUpdate(ActivityTemplateDO activityTemplateDo) // We're updating existing ActivityTemplate. else { - if (activity.Id != activityTemplateDo.Id) - { - throw new InvalidOperationException($"Existent activity with same Name ({activity.Name}) and Version ({activity.Version}) that we passed " - + $"has different Id. (ExistentId = {activity.Id}. Passed Id = {activityTemplateDo.Id}. Changing of activity template Id is not possible. If you need to have another Id please update the version number or create new activity template"); - } + // TODO: FR-4943, this breaks DEV's activity registration, commented out for now. + // if (activity.Id != activityTemplateDo.Id) + // { + // throw new InvalidOperationException($"Existent activity with same Name ({activity.Name}) and Version ({activity.Version}) that we passed " + // + $"has different Id. (ExistentId = {activity.Id}. Passed Id = {activityTemplateDo.Id}. Changing of activity template Id is not possible. If you need to have another Id please update the version number or create new activity template"); + // } + // This is for updating activity template CopyPropertiesHelper.CopyProperties(activityTemplateDo, activity, false, x => x.Name != "Id"); activity.ActivityTemplateState = ActivityTemplateState.Active; - activity.WebService = activityTemplateDo.WebService; + uow.SaveChanges(); activity.Categories = ApplyActivityCategories(uow, activity, activityCategories); diff --git a/Hub/Services/Authorization.cs b/Hub/Services/Authorization.cs index a40d4c2bae..56c2dada73 100644 --- a/Hub/Services/Authorization.cs +++ b/Hub/Services/Authorization.cs @@ -36,7 +36,7 @@ public Authorization() _activityTemplate = ObjectFactory.GetInstance<IActivityTemplate>(); } - public string GetToken(string userId, int terminalId) + public string GetToken(string userId, Guid terminalId) { using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { @@ -466,7 +466,7 @@ public bool ValidateAuthenticationNeeded(IUnitOfWork uow, string userId, Activit /// terminal will be done. If the main token is found, it will be assigned to the supplied ActivityDO. /// </summary> /// <returns>true if token is found. false, if not.</returns> - public bool TryAssignAuthToken(IUnitOfWork uow, string userId, int terminalId, ActivityDO activityDO, out AuthorizationTokenDO curAuthToken) + public bool TryAssignAuthToken(IUnitOfWork uow, string userId, Guid terminalId, ActivityDO activityDO, out AuthorizationTokenDO curAuthToken) { curAuthToken = uow.AuthorizationTokenRepository.FindTokenById(activityDO.AuthorizationTokenId); diff --git a/Hub/Services/ContainerService.ExecutionSession.cs b/Hub/Services/ContainerService.ExecutionSession.cs index e37e7d12f9..6cb30344ce 100644 --- a/Hub/Services/ContainerService.ExecutionSession.cs +++ b/Hub/Services/ContainerService.ExecutionSession.cs @@ -84,10 +84,11 @@ private void AddNodeForExecution(Guid nodeId) { var node = _uow.PlanRepository.GetById<PlanNodeDO>(nodeId); string nodeName = "undefined"; - + if (node is ActivityDO) { - nodeName = "Activity: " + ((ActivityDO) node).Name; + var activityTemplate = _uow.ActivityTemplateRepository.GetByKey(((ActivityDO)node).ActivityTemplateId); + nodeName = "Activity: " + activityTemplate.Name +" Version:" + activityTemplate.Version; } if (node is SubplanDO) @@ -211,7 +212,9 @@ public async Task Run() if (curActivity != null) { - throw new ActivityExecutionException(Mapper.Map<ContainerDO, ContainerDTO>(_container), Mapper.Map<ActivityDO, ActivityDTO>(curActivity), string.Empty, e); + var activityDTO = Mapper.Map<ActivityDO, ActivityDTO>(curActivity); + activityDTO.ActivityTemplate = Mapper.Map<ActivityTemplateSummaryDTO>(_uow.ActivityTemplateRepository.GetByKey(curActivity.ActivityTemplateId)); + throw new ActivityExecutionException(Mapper.Map<ContainerDO, ContainerDTO>(_container), activityDTO, string.Empty, e); } throw; diff --git a/Hub/Services/ContainerService.cs b/Hub/Services/ContainerService.cs index 2a1c7e6c78..7277a64b06 100644 --- a/Hub/Services/ContainerService.cs +++ b/Hub/Services/ContainerService.cs @@ -199,7 +199,8 @@ private OperationalStateCM.ActivityCallStack RecoverCallStack(IUnitOfWork uow, C if (node is ActivityDO) { - nodeName = "Activity: " + ((ActivityDO)node).Name; + var activityTemplate = uow.ActivityTemplateRepository.GetByKey(((ActivityDO)node).ActivityTemplateId); + nodeName = "Activity: " + activityTemplate.Name + " Version:" + activityTemplate.Version; } if (node is SubplanDO) @@ -254,20 +255,9 @@ public IList<ContainerDO> GetByFr8Account(IUnitOfWork unitOfWork, Fr8AccountDO a private void ReportAuthError(IUnitOfWork uow, Fr8AccountDO user, InvalidTokenRuntimeException ex) { var activityTemplate = ex?.FailedActivityDTO.ActivityTemplate; - string webServiceName = null; - if (activityTemplate != null) - { - var webService = uow.ActivityTemplateRepository.GetQuery() - .Where(x => x.Name == activityTemplate.Name && x.Version == activityTemplate.Version) - .Select(x => x.WebService) - .FirstOrDefault(); - webServiceName = webService?.Name; - } - - string errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with " + - $"{webServiceName}. "; - errorMessage += $"Please re-authorize Fr8 to connect to {webServiceName} " + + var errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with remote web-service."; + errorMessage += $"Please re-authorize {ex?.FailedActivityDTO.Label} activity " + $"by clicking on the Settings dots in the upper " + $"right corner of the activity and then selecting Choose Authentication. "; @@ -281,6 +271,7 @@ private void ReportAuthError(IUnitOfWork uow, Fr8AccountDO user, InvalidTokenRun _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = errorMessage, Collapsed = false }, user.Id); diff --git a/Hub/Services/Event.cs b/Hub/Services/Event.cs index 84ad815a4c..0a2955f726 100644 --- a/Hub/Services/Event.cs +++ b/Hub/Services/Event.cs @@ -13,6 +13,7 @@ using Fr8.Infrastructure.Data.Managers; using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Utilities.Logging; +using Fr8.Infrastructure.Data.States; namespace Hub.Services { @@ -151,7 +152,7 @@ private void FindAndExecuteAccountPlans( { //find this Account's Plans var initialPlansList = uow.PlanRepository.GetPlanQueryUncached() - .Where(pt => pt.Fr8AccountId == curDockyardAccountId && pt.PlanState == PlanState.Running).ToList(); + .Where(pt => pt.Fr8AccountId == curDockyardAccountId && (pt.PlanState == PlanState.Executing || pt.PlanState == PlanState.Active)).ToList(); var subscribingPlans = _plan.MatchEvents(initialPlansList, eventReportMS); Logger.GetLogger().Info($"Upon receiving event for account '{eventReportMS.ExternalAccountId}' {subscribingPlans.Count} of {initialPlansList.Count} will be notified"); diff --git a/Hub/Services/Fr8Account.cs b/Hub/Services/Fr8Account.cs index dba7aea9f0..b3574b2bd1 100644 --- a/Hub/Services/Fr8Account.cs +++ b/Hub/Services/Fr8Account.cs @@ -16,6 +16,7 @@ using System.Net.Http; using Fr8.Infrastructure.Utilities; using Hub.Interfaces; +using Fr8.Infrastructure.Data.States; namespace Hub.Services { @@ -484,7 +485,8 @@ public IEnumerable<PlanDO> GetActivePlans(string userId) var planQuery = unitOfWork.PlanRepository.GetPlanQueryUncached().Include(i => i.Fr8Account); planQuery - .Where(pt => pt.PlanState == PlanState.Running)//1. + .Where(pt => pt.PlanState == PlanState.Executing || + pt.PlanState == PlanState.Active)//1. .Where(id => id.Fr8Account.Id == userId);//2 activePlans = planQuery.ToList(); diff --git a/Hub/Services/Plan.cs b/Hub/Services/Plan.cs index b5b7e7c9b7..27775f8ec6 100644 --- a/Hub/Services/Plan.cs +++ b/Hub/Services/Plan.cs @@ -84,9 +84,16 @@ public PlanResultDTO GetForUser(IUnitOfWork unitOfWork, Fr8AccountDO account, Pl planQuery = planQuery.Where(c => c.Name.Contains(planQueryDTO.Filter) || c.Description.Contains(planQueryDTO.Filter)); } - planQuery = planQueryDTO.Status == null + int? planState = null; + + if (planQueryDTO.Status != null) + { + planState = PlanState.StringToInt(planQueryDTO.Status); + } + + planQuery = planState == null ? planQuery.Where(pt => pt.PlanState != PlanState.Deleted) - : planQuery.Where(pt => pt.PlanState == planQueryDTO.Status); + : planQuery.Where(pt => pt.PlanState == planState); // Lets allow ordering with just name for now if (planQueryDTO.OrderBy == "name") @@ -131,9 +138,12 @@ public int UserPlansCount(IUnitOfWork uow,string userId) public bool IsMonitoringPlan(IUnitOfWork uow, PlanDO plan) { + var solutionId = ActivityCategories.SolutionId; + var monitorId = ActivityCategories.MonitorId; + var initialActivity = plan.StartingSubplan.GetDescendantsOrdered() .OfType<ActivityDO>() - .FirstOrDefault(x => uow.ActivityTemplateRepository.GetByKey(x.ActivityTemplateId).Category != Fr8.Infrastructure.Data.States.ActivityCategory.Solution); + .FirstOrDefault(x => !uow.ActivityTemplateRepository.GetByKey(x.ActivityTemplateId).Categories.Any(y => y.ActivityCategoryId == solutionId)); if (initialActivity == null) { @@ -142,7 +152,7 @@ public bool IsMonitoringPlan(IUnitOfWork uow, PlanDO plan) var activityTemplate = uow.ActivityTemplateRepository.GetByKey(initialActivity.ActivityTemplateId); - if (activityTemplate.Category == Fr8.Infrastructure.Data.States.ActivityCategory.Monitors) + if (activityTemplate.Categories.Any(y => y.ActivityCategoryId == monitorId)) { return true; } @@ -329,9 +339,9 @@ public async Task<ActivateActivitiesDTO> Activate(Guid curPlanId, bool planBuild } } - if (result.ValidationErrors.Count == 0 && plan.PlanState != PlanState.Running) + if (result.ValidationErrors.Count == 0 && plan.PlanState != PlanState.Executing) { - plan.PlanState = PlanState.Running; + plan.PlanState = IsMonitoringPlan(uow, plan) ? PlanState.Active : PlanState.Executing; plan.LastUpdated = DateTimeOffset.UtcNow; uow.SaveChanges(); } @@ -352,6 +362,19 @@ public IEnumerable<ValidationResultDTO> ExtractValidationErrors(ActivityDTO curA return crateStorage.CrateContentsOfType<ValidationResultsCM>().SelectMany(x => x.ValidationErrors); } + public bool IsPlanActiveOrExecuting(Guid planNodeId) + { + using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) + { + var planState = GetPlanState(uow, planNodeId); + if (planState == PlanState.Executing || planState == PlanState.Active) + { + return true; + } + return false; + } + } + public async Task Deactivate(Guid planId) { var deactivateTasks = new List<Task>(); @@ -584,7 +607,13 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe if (activity != null) { - var label = string.IsNullOrWhiteSpace(activity.Label) ? activity.Name : activity.Label; + + var label = string.IsNullOrWhiteSpace(activity.Label) ? activity.ActivityTemplate?.Name : activity.Label; + if (label == null) + { + var template = uow.ActivityTemplateRepository.GetByKey(activity.ActivityTemplateId); + label = template.Name; + } if (string.IsNullOrWhiteSpace(label)) { @@ -602,6 +631,7 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = $"Validation failed for activities: {activitiesList} from plan \"{plan.Name}\". See activity configuration pane for details.", Collapsed = false }, currentUserId); @@ -649,6 +679,7 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Success", Message = $"Plan \"{plan.Name}\" activated. It will wait and respond to specified external events.", Collapsed = false }, currentUserId); @@ -667,6 +698,7 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Success", Message = $"Continue execution of the suspended Plan \"{plan.Name}\"", Collapsed = false }, currentUserId); @@ -682,6 +714,7 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Success", Message = $"Complete processing for Plan \"{plan.Name}\".{responseMsg}", Collapsed = false }, currentUserId); @@ -691,6 +724,7 @@ public async Task<ContainerDTO> Run(Guid planId, Crate[] payload, Guid? containe _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = $"Failed executing plan \"{plan.Name}\"", Collapsed = false }, currentUserId); @@ -784,6 +818,7 @@ private void NotifyWithErrorMessage(Exception exception, PlanDO planDO, string u _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = String.Format("Plan \"{0}\" failed. {1}", planDO.Name, messageToNotify), Collapsed = false }, userId); @@ -820,6 +855,7 @@ private void ReportGenericValidationErrors(string userId, string activityLabel, _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = $"Validation of activity '{activityLabel}' from plan \"{planName}\" failed: {errors}", Collapsed = false }, userId); @@ -918,20 +954,9 @@ public PlanDO Clone(Guid planId) private void ReportAuthError(IUnitOfWork uow, Fr8AccountDO user, InvalidTokenRuntimeException ex) { var activityTemplate = ex?.FailedActivityDTO.ActivityTemplate; - string webServiceName = null; - if (activityTemplate != null) - { - var webService = uow.ActivityTemplateRepository.GetQuery() - .Where(x => x.Name == activityTemplate.Name && x.Version == activityTemplate.Version) - .Select(x => x.WebService) - .FirstOrDefault(); - webServiceName = webService?.Name; - } - - string errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with " + - $"{webServiceName}. "; - errorMessage += $"Please re-authorize Fr8 to connect to {webServiceName} " + + var errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with remote web-service."; + errorMessage += $"Please re-authorize {ex?.FailedActivityDTO.Label} activity " + $"by clicking on the Settings dots in the upper " + $"right corner of the activity and then selecting Choose Authentication. "; @@ -945,6 +970,7 @@ private void ReportAuthError(IUnitOfWork uow, Fr8AccountDO user, InvalidTokenRun _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = errorMessage, Collapsed = false }, user.Id); @@ -953,24 +979,14 @@ private void ReportAuthError(IUnitOfWork uow, Fr8AccountDO user, InvalidTokenRun private async Task ReportAuthDeactivation(IUnitOfWork uow, PlanDO plan, InvalidTokenRuntimeException ex) { var activityTemplate = ex?.FailedActivityDTO.ActivityTemplate; - string webServiceName = null; - if (activityTemplate != null) - { - var webService = uow.ActivityTemplateRepository.GetQuery() - .Where(x => x.Name == activityTemplate.Name && x.Version == activityTemplate.Version) - .Select(x => x.WebService) - .FirstOrDefault(); - webServiceName = webService?.Name; - } - - string errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with " + - $"{webServiceName}. "; + string errorMessage = $"Activity {ex?.FailedActivityDTO.Label} was unable to authenticate with remote web-service."; errorMessage += $"Plan \"{plan.Name}\" which contains failed activity was deactivated."; _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = errorMessage, Collapsed = false }, plan.Fr8AccountId); diff --git a/Hub/Services/PlanBased/ManifestRegistryMonitor.cs b/Hub/Services/PlanBased/ManifestRegistryMonitor.cs index ffed53d7b3..37858afebe 100644 --- a/Hub/Services/PlanBased/ManifestRegistryMonitor.cs +++ b/Hub/Services/PlanBased/ManifestRegistryMonitor.cs @@ -15,6 +15,7 @@ using Fr8.Infrastructure.Utilities.Logging; using Hub.Interfaces; using Hub.Managers; +using Fr8.Infrastructure.Data.States; namespace Hub.Services { @@ -144,7 +145,7 @@ public async Task<ManifestRegistryMonitorResult> StartMonitoringManifestRegistry private async Task RunPlan(PlanDO plan) { - if (plan.PlanState == PlanState.Running) + if (plan.PlanState == PlanState.Executing || plan.PlanState == PlanState.Active) { return; } diff --git a/Services/PlanDirectory/Infrastructure/ActivityTemplateTag.cs b/Hub/Services/PlanDirectory/ActivityTemplateTag.cs similarity index 59% rename from Services/PlanDirectory/Infrastructure/ActivityTemplateTag.cs rename to Hub/Services/PlanDirectory/ActivityTemplateTag.cs index ad4b50e23d..21e4e936cb 100644 --- a/Services/PlanDirectory/Infrastructure/ActivityTemplateTag.cs +++ b/Hub/Services/PlanDirectory/ActivityTemplateTag.cs @@ -4,12 +4,12 @@ using Fr8.Infrastructure.Data.DataTransferObjects; using Newtonsoft.Json; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class ActivityTemplateTag : TemplateTag { //id, WebServiceId, name - private List<Tuple<Guid, int, string>> _values = new List<Tuple<Guid, int, string>>(); + private List<Tuple<Guid, Guid, string>> _values = new List<Tuple<Guid, Guid, string>>(); [JsonIgnore] public override string Title { get { return string.Join(", ", _values.Select(a => a.Item3).ToArray()); } } @@ -17,7 +17,12 @@ public class ActivityTemplateTag : TemplateTag public ActivityTemplateTag(List<ActivityTemplateDTO> values) { values.ForEach(a => - { _values.Add(new Tuple<Guid, int, string>(a.Id, a.WebService.Id, a.Name)); }); + { + a.Categories.ToList().ForEach(c => + { + _values.Add(new Tuple<Guid, Guid, string>(a.Id, c.Id, a.Name)); + }); + }); } } } \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/ManifestPageGenerator.cs b/Hub/Services/PlanDirectory/ManifestPageGenerator.cs similarity index 96% rename from Services/PlanDirectory/Infrastructure/ManifestPageGenerator.cs rename to Hub/Services/PlanDirectory/ManifestPageGenerator.cs index ce1cae3503..dad08e82f3 100644 --- a/Services/PlanDirectory/Infrastructure/ManifestPageGenerator.cs +++ b/Hub/Services/PlanDirectory/ManifestPageGenerator.cs @@ -5,12 +5,12 @@ using Data.Entities; using Data.Interfaces; using Fr8.Infrastructure.Data.Manifests; +using Hub.Enums; +using Hub.Exceptions; using Hub.Interfaces; -using PlanDirectory.Exceptions; -using PlanDirectory.Interfaces; -using PlanDirectory.ManifestPages; +using Hub.Resources; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class ManifestPageGenerator : IManifestPageGenerator { diff --git a/Services/PlanDirectory/Infrastructure/PlanTemplate.Impl.cs b/Hub/Services/PlanDirectory/PlanTemplate.Impl.cs similarity index 96% rename from Services/PlanDirectory/Infrastructure/PlanTemplate.Impl.cs rename to Hub/Services/PlanDirectory/PlanTemplate.Impl.cs index e63d6986bd..ceac6b80f4 100644 --- a/Services/PlanDirectory/Infrastructure/PlanTemplate.Impl.cs +++ b/Hub/Services/PlanDirectory/PlanTemplate.Impl.cs @@ -1,18 +1,16 @@ using System; using System.Linq; using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using StructureMap; using Data.Entities; using Data.Infrastructure.StructureMap; using Data.Interfaces; using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.Manifests; -using PlanDirectory.Interfaces; +using Hub.Interfaces; +using StructureMap; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class PlanTemplate : IPlanTemplate { @@ -54,7 +52,7 @@ public Task<PlanTemplateCM> CreateOrUpdate(string fr8AccountId, PublishPlanTempl if (existingPlanTemplateCM == null && objectId.HasValue) { - ObjectFactory.GetInstance<ISecurityServices>().SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, objectId.ToString(), "Plan Template"); + ObjectFactory.GetInstance<ISecurityServices>().SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, objectId.Value, "Plan Template"); } return Task.FromResult(planTemplateCM); diff --git a/Services/PlanDirectory/Infrastructure/SearchProvider.Impl.cs b/Hub/Services/PlanDirectory/SearchProvider.Impl.cs similarity index 98% rename from Services/PlanDirectory/Infrastructure/SearchProvider.Impl.cs rename to Hub/Services/PlanDirectory/SearchProvider.Impl.cs index fbc68ca1d9..8523785b75 100644 --- a/Services/PlanDirectory/Infrastructure/SearchProvider.Impl.cs +++ b/Hub/Services/PlanDirectory/SearchProvider.Impl.cs @@ -2,13 +2,14 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Fr8.Infrastructure.Data.DataTransferObjects.PlanDirectory; using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Utilities.Configuration; +using Hub.Interfaces; using Microsoft.Azure.Search; using Microsoft.Azure.Search.Models; -using PlanDirectory.Interfaces; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class SearchProvider : ISearchProvider { diff --git a/Services/PlanDirectory/Infrastructure/TagGenerator.cs b/Hub/Services/PlanDirectory/TagGenerator.cs similarity index 77% rename from Services/PlanDirectory/Infrastructure/TagGenerator.cs rename to Hub/Services/PlanDirectory/TagGenerator.cs index 0e2264bae8..18b31f6046 100644 --- a/Services/PlanDirectory/Infrastructure/TagGenerator.cs +++ b/Hub/Services/PlanDirectory/TagGenerator.cs @@ -1,18 +1,25 @@ -using PlanDirectory.Interfaces; -using System; +using System; using System.Collections.Generic; using System.Linq; -using StructureMap; using System.Threading.Tasks; +using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Interfaces; using Fr8.Infrastructure.Utilities.Configuration; -using Fr8.Infrastructure.Data.DataTransferObjects; +using Hub.Interfaces; +using StructureMap; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class TagGenerator : ITagGenerator { + private readonly IPlanNode _activity; + + public TagGenerator(IPlanNode activity) + { + _activity = activity; + } + /// <summary> /// The result of this method is a a list of ActivityTemplateTag and WebServiceTemplateTag classes /// For a plan, that consists of activity named "A" of a webservice "Y" @@ -30,20 +37,21 @@ public async Task<TemplateTagStorage> GetTags(PlanTemplateCM planTemplateCM, str var result = new TemplateTagStorage(); //requesting all activity templates - var hmacService = ObjectFactory.GetInstance<IHMACService>(); - var client = ObjectFactory.GetInstance<IRestfulServiceClient>(); - - var uri = new Uri(CloudConfigurationManager.GetSetting("HubApiBaseUrl") + "activitytemplates"); - var headers = await hmacService.GenerateHMACHeader( - uri, - "PlanDirectory", - CloudConfigurationManager.GetSetting("PlanDirectorySecret"), - fr8AccountId, - null - ); - - var activityCategories = await client.GetAsync<IEnumerable<ActivityTemplateCategoryDTO>>( - uri, headers: headers); + //var hmacService = ObjectFactory.GetInstance<IHMACService>(); + //var client = ObjectFactory.GetInstance<IRestfulServiceClient>(); + + //var uri = new Uri(CloudConfigurationManager.GetSetting("HubApiUrl") + "/activitytemplates"); + //var headers = await hmacService.GenerateHMACHeader( + // uri, + // "PlanDirectory", + // CloudConfigurationManager.GetSetting("PlanDirectorySecret"), + // fr8AccountId, + // null + //); + + var activityCategories = _activity.GetAvailableActivityGroups(); + // await client.GetAsync<IEnumerable<ActivityTemplateCategoryDTO>>( + //uri, headers: headers); var activityDict = activityCategories .SelectMany(a => a.Activities) @@ -79,9 +87,16 @@ public async Task<TemplateTagStorage> GetTags(PlanTemplateCM planTemplateCM, str activityTemplatesCombinations.ForEach(a => result.ActivityTemplateTags.Add(new ActivityTemplateTag(a))); //4. adding tags for webservices - var usedWebServices = usedActivityTemplates.Select(a => a.WebService).Distinct(WebServiceDTO.NameComparer).OrderBy(b => b.Name).ToList(); - var webServicesCombination = GetCombinations<WebServiceDTO>(usedWebServices); - webServicesCombination.ForEach(a => result.WebServiceTemplateTags.Add(new WebServiceTemplateTag(a))); + var usedWebServices = usedActivityTemplates + .SelectMany(x => x.Categories) + .Distinct(ActivityCategoryDTO.NameComparer) + .OrderBy(b => b.Name) + .ToList(); + + var webServicesCombination = GetCombinations<ActivityCategoryDTO>(usedWebServices); + webServicesCombination.ForEach( + a => result.WebServiceTemplateTags.Add(new WebServiceTemplateTag(a)) + ); return result; } diff --git a/Services/PlanDirectory/Infrastructure/TemplateGenerator.cs b/Hub/Services/PlanDirectory/TemplateGenerator.cs similarity index 96% rename from Services/PlanDirectory/Infrastructure/TemplateGenerator.cs rename to Hub/Services/PlanDirectory/TemplateGenerator.cs index 90f2a68452..0d8bff73e1 100644 --- a/Services/PlanDirectory/Infrastructure/TemplateGenerator.cs +++ b/Hub/Services/PlanDirectory/TemplateGenerator.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using PlanDirectory.Interfaces; +using Hub.Interfaces; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class TemplateGenerator : ITemplateGenerator { diff --git a/Services/PlanDirectory/Infrastructure/TemplateTag.cs b/Hub/Services/PlanDirectory/TemplateTag.cs similarity index 79% rename from Services/PlanDirectory/Infrastructure/TemplateTag.cs rename to Hub/Services/PlanDirectory/TemplateTag.cs index 0144d4d34a..433f5779c8 100644 --- a/Services/PlanDirectory/Infrastructure/TemplateTag.cs +++ b/Hub/Services/PlanDirectory/TemplateTag.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public abstract class TemplateTag { diff --git a/Services/PlanDirectory/Infrastructure/TemplateTagStorage.cs b/Hub/Services/PlanDirectory/TemplateTagStorage.cs similarity index 92% rename from Services/PlanDirectory/Infrastructure/TemplateTagStorage.cs rename to Hub/Services/PlanDirectory/TemplateTagStorage.cs index 433d96540d..1a424aeeef 100644 --- a/Services/PlanDirectory/Infrastructure/TemplateTagStorage.cs +++ b/Hub/Services/PlanDirectory/TemplateTagStorage.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class TemplateTagStorage { diff --git a/Services/PlanDirectory/Infrastructure/WebServiceTemplateTag.cs b/Hub/Services/PlanDirectory/WebServiceTemplateTag.cs similarity index 66% rename from Services/PlanDirectory/Infrastructure/WebServiceTemplateTag.cs rename to Hub/Services/PlanDirectory/WebServiceTemplateTag.cs index ead73f571a..a00a26919a 100644 --- a/Services/PlanDirectory/Infrastructure/WebServiceTemplateTag.cs +++ b/Hub/Services/PlanDirectory/WebServiceTemplateTag.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Web; using Fr8.Infrastructure.Data.DataTransferObjects; using Newtonsoft.Json; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class WebServiceTemplateTag : TemplateTag { //id, iconPath, name - private List<Tuple<int, string, string>> _values = new List<Tuple<int, string, string>>(); + private List<Tuple<Guid, string, string>> _values = new List<Tuple<Guid, string, string>>(); public Dictionary<string, string> TagsWithIcons { @@ -23,10 +22,10 @@ public override string Title get { return string.Join(", ", _values.Select(a => a.Item3).ToArray()); } } - public WebServiceTemplateTag(List<WebServiceDTO> values) + public WebServiceTemplateTag(List<ActivityCategoryDTO> values) { values.ForEach(a => - { _values.Add(new Tuple<int, string, string>(a.Id, a.IconPath, a.Name)); }); + { _values.Add(new Tuple<Guid, string, string>(a.Id, a.IconPath, a.Name)); }); } } } \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/WebservicesPageGenerator.cs b/Hub/Services/PlanDirectory/WebservicesPageGenerator.cs similarity index 93% rename from Services/PlanDirectory/Infrastructure/WebservicesPageGenerator.cs rename to Hub/Services/PlanDirectory/WebservicesPageGenerator.cs index da73a7305f..dbba1a20eb 100644 --- a/Services/PlanDirectory/Infrastructure/WebservicesPageGenerator.cs +++ b/Hub/Services/PlanDirectory/WebservicesPageGenerator.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using Data.Entities; @@ -8,10 +7,9 @@ using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Utilities.Configuration; using Hub.Interfaces; -using PlanDirectory.CategoryPages; -using PlanDirectory.Interfaces; +using Hub.Resources; -namespace PlanDirectory.Infrastructure +namespace Hub.Services.PlanDirectory { public class WebservicesPageGenerator : IWebservicesPageGenerator { @@ -66,8 +64,8 @@ public async Task Generate(PlanTemplateCM planTemplate, string fr8AccountId) Tuple<string, string, string>( publishPlanTemplateDTO.Name, publishPlanTemplateDTO.Description ?? publishPlanTemplateDTO.Name, - CloudConfigurationManager.GetSetting("HubApiBaseUrl").Replace("/api/v1/", "") - + "/dashboard/plans/" + publishPlanTemplateDTO.ParentPlanId + "/builder?viewMode=plan")); + CloudConfigurationManager.GetSetting("HubApiUrl").Replace("/api/v1/", "") + + "dashboard/plans/" + publishPlanTemplateDTO.ParentPlanId + "/builder?viewMode=plan")); } await _templateGenerator.Generate(new PlanCategoryTemplate(), pageName, new Dictionary<string, object> { diff --git a/Hub/Services/PlanDirectoryService.cs b/Hub/Services/PlanDirectoryService.cs index 58329d12c1..ab37764547 100644 --- a/Hub/Services/PlanDirectoryService.cs +++ b/Hub/Services/PlanDirectoryService.cs @@ -13,6 +13,7 @@ using Fr8.Infrastructure.Data.States; using Fr8.Infrastructure.Interfaces; using Fr8.Infrastructure.Utilities.Configuration; +using Fr8.Infrastructure.Utilities.Logging; using Hub.Helper; using Hub.Interfaces; using Newtonsoft.Json.Linq; @@ -28,12 +29,21 @@ public class PlanDirectoryService : IPlanDirectoryService private readonly IPlan _planService; private readonly IActivityTemplate _activityTemplate; + private readonly IPlanTemplate _planTemplate; + private readonly ISearchProvider _searchProvider; + private readonly IWebservicesPageGenerator _webservicesPageGenerator; + + + public PlanDirectoryService(IHMACService hmac, IRestfulServiceClient client, IPusherNotifier pusherNotifier, IUnitOfWorkFactory unitOfWorkFactory, IPlan planService, - IActivityTemplate activityTemplate) + IActivityTemplate activityTemplate, + IPlanTemplate planTemplate, + ISearchProvider searchProvider, + IWebservicesPageGenerator webservicesPageGenerator) { _hmacService = hmac; _client = client; @@ -41,43 +51,23 @@ public PlanDirectoryService(IHMACService hmac, _unitOfWorkFactory = unitOfWorkFactory; _planService = planService; _activityTemplate = activityTemplate; - } - - public async Task<string> GetToken(string UserId) - { - var uri = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/api/authentication/token"); - var headers = - await - _hmacService.GenerateHMACHeader(uri, "PlanDirectory", - CloudConfigurationManager.GetSetting("PlanDirectorySecret"), UserId); - - var json = await _client.PostAsync<JObject>(uri, headers: headers); - var token = json.Value<string>("token"); - return token; - } - - public string LogOutUrl() - { - return CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/Home/LogoutByToken"; + _planTemplate = planTemplate; + _searchProvider = searchProvider; + _webservicesPageGenerator = webservicesPageGenerator; } + public async Task<PublishPlanTemplateDTO> GetTemplate(Guid id, string userId) { - var uri = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/api/plan_templates?id=" + id); - var headers = await _hmacService.GenerateHMACHeader( - uri, - "PlanDirectory", - CloudConfigurationManager.GetSetting("PlanDirectorySecret"), - userId - ); - try { - return await _client.GetAsync<PublishPlanTemplateDTO>(uri, headers: headers); + var planTemplateDTO = await _planTemplate.GetPlanTemplateDTO(userId, id); + return planTemplateDTO; } - catch (Fr8.Infrastructure.Communication.RestfulServiceException) + catch(Exception exp) { + Logger.GetLogger().Error($"Error retriving plan template: {exp.Message}"); return null; } } @@ -94,43 +84,56 @@ public async Task Share(Guid planId, string userId) PlanContents = planDto }; - var uri = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/api/plan_templates/"); - var headers = await _hmacService.GenerateHMACHeader( - uri, - "PlanDirectory", - CloudConfigurationManager.GetSetting("PlanDirectorySecret"), - userId, - dto - ); - - await _client.PostAsync(uri, dto, headers: headers); + var planTemplateCM = await _planTemplate.CreateOrUpdate(userId, dto); + await _searchProvider.CreateOrUpdate(planTemplateCM); + await _webservicesPageGenerator.Generate(planTemplateCM, userId); // Notify user with directing him to PlanDirectory with related search query - var url = CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/#?planSearch=" + HttpUtility.UrlEncode(dto.Name); + var url = CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/plan_directory#?planSearch=" + HttpUtility.UrlEncode(dto.Name); _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Success", Message = $"Plan Shared. To view, click on " + url, Collapsed = false }, userId); } - public async Task Unpublish(Guid planId, string userId) + public async Task Unpublish(Guid planId, string userId, bool privileged) { - var uri = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/api/plan_templates/?id=" + planId); - var headers = await _hmacService.GenerateHMACHeader( - uri, - "PlanDirectory", - CloudConfigurationManager.GetSetting("PlanDirectorySecret"), - userId - ); + //TODO: add security check with new security model + //var identity = User.Identity as ClaimsIdentity; + //var privileged = identity.HasClaim(ClaimsIdentity.DefaultRoleClaimType, "Admin"); + //var fr8AccountId = identity.GetUserId(); + + var planTemplateCM = await _planTemplate.Get(userId, planId); + + if (planTemplateCM != null) + { + if (planTemplateCM.OwnerId != userId && !privileged) + { + throw new UnauthorizedAccessException(); // Unauthorized(); + } + await _planTemplate.Remove(userId, planId); + await _searchProvider.Remove(planId); + } + + + //var uri = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl") + "/api/v1/plan_templates/?id=" + planId); + //var headers = await _hmacService.GenerateHMACHeader( + // uri, + // "PlanDirectory", + // CloudConfigurationManager.GetSetting("PlanDirectorySecret"), + // userId + //); - await _client.DeleteAsync(uri, headers: headers); + //await _client.DeleteAsync(uri, headers: headers); // Notify user that plan successfully deleted _pusherNotifier.NotifyUser(new NotificationMessageDTO { NotificationType = NotificationType.GenericSuccess, + Subject = "Success", Message = $"Plan Unpublished.", Collapsed = false }, userId); @@ -257,7 +260,7 @@ public PlanNoChildrenDTO CreateFromTemplate(PlanDTO plan, string userId) if (!_activityTemplate.TryGetByKey(activity.ActivityTemplateId, out activityTemplate)) { - throw new KeyNotFoundException($"Activity '{activity.Name}' use activity template '{activity.ActivityTemplate?.Name}' with id = '{activity.ActivityTemplateId}' that is unknown to this Hub"); + throw new KeyNotFoundException($"Activity '{activity.Id}' use activity template '{activity.ActivityTemplate?.Name}' with id = '{activity.ActivityTemplateId}' that is unknown to this Hub"); } activity.CrateStorage = UpdateCrateStorage(activity.CrateStorage, idsMap); diff --git a/Hub/Services/PlanNode.cs b/Hub/Services/PlanNode.cs index afcf68c19f..e633fcf993 100644 --- a/Hub/Services/PlanNode.cs +++ b/Hub/Services/PlanNode.cs @@ -14,10 +14,39 @@ using Hub.Interfaces; using Hub.Managers; + namespace Hub.Services { public class PlanNode : IPlanNode { + #region ActivityCategories comparer. + + private class ActivitiesCategoriesComparer : IComparer<IEnumerable<ActivityCategorySetDO>> + { + public int Compare(IEnumerable<ActivityCategorySetDO> x, IEnumerable<ActivityCategorySetDO> y) + { + var xIndex = GetActivityCategoryIndex(x); + var yIndex = GetActivityCategoryIndex(y); + + return xIndex.CompareTo(yIndex); + } + + private static int GetActivityCategoryIndex(IEnumerable<ActivityCategorySetDO> s) + { + for (int i = 0; i < ActivityCategories.ActivityCategoryIds.Count; ++i) + { + if (s.Select(x => x.ActivityCategoryId).Contains(ActivityCategories.ActivityCategoryIds[i])) + { + return i + 1; + } + } + + return ActivityCategories.ActivityCategoryIds.Count + 1; + } + } + + #endregion ActivityCategories comparer. + #region Fields private readonly ICrateManager _crate; @@ -283,7 +312,7 @@ public IEnumerable<ActivityTemplateDTO> GetAvailableActivities(IUnitOfWork uow, curActivityTemplates = _activityTemplate .GetAll() - .OrderBy(t => t.Category) + .OrderBy(t => t.Categories, new ActivitiesCategoriesComparer()) .Select(Mapper.Map<ActivityTemplateDTO>) .ToList(); @@ -309,19 +338,21 @@ public IEnumerable<ActivityTemplateDTO> GetAvailableActivities(IUnitOfWork uow, .GetAll() .Where(predicate) .Where(at => at.ActivityTemplateState == Data.States.ActivityTemplateState.Active) - .OrderBy(t => t.Category) + .OrderBy(t => t.Categories, new ActivitiesCategoriesComparer()) .Select(Mapper.Map<ActivityTemplateDTO>) .ToList(); } public IEnumerable<ActivityTemplateDTO> GetSolutions(IUnitOfWork uow) { + var solutionId = ActivityCategories.SolutionId; + IEnumerable<ActivityTemplateDTO> curActivityTemplates; curActivityTemplates = _activityTemplate .GetAll() - .Where(at => at.Category == Fr8.Infrastructure.Data.States.ActivityCategory.Solution + .Where(at => at.Categories.Any(y => y.ActivityCategoryId == solutionId) && at.ActivityTemplateState == Data.States.ActivityTemplateState.Active) - .OrderBy(t => t.Category) + .OrderBy(t => t.Categories, new ActivitiesCategoriesComparer()) .Select(Mapper.Map<ActivityTemplateDTO>) .ToList(); @@ -340,21 +371,30 @@ public IEnumerable<ActivityTemplateDTO> GetSolutions(IUnitOfWork uow) public IEnumerable<ActivityTemplateCategoryDTO> GetAvailableActivityGroups() { - var curActivityTemplates = _activityTemplate + var availableTerminalIds = _terminal.GetAll().Select(x=>x.Id).ToList(); + var activityTemplates = _activityTemplate .GetQuery() - .Where(at => at.ActivityTemplateState == ActivityTemplateState.Active).AsEnumerable().ToArray() - .GroupBy(t => t.Category) - .OrderBy(c => c.Key) - .Select(c => new ActivityTemplateCategoryDTO + .Where(at => at.ActivityTemplateState == ActivityTemplateState.Active + && availableTerminalIds.Contains(at.TerminalId)).AsEnumerable().ToArray() + .ToList(); + + var result = ActivityCategories.ActivityCategoryList + .Where(x => activityTemplates.Any(y => y.Categories.Any(z => z.ActivityCategoryId == x.Id) + && y.ActivityTemplateState == ActivityTemplateState.Active)) + .Select(x => new ActivityTemplateCategoryDTO() { - Activities = c.GroupBy(x => x.Name) - .Select(x => x.OrderByDescending(y => int.Parse(y.Version)).First()) - .Select(Mapper.Map<ActivityTemplateDTO>).ToList(), - Name = c.Key.ToString() + Name = x.Name, + Activities = activityTemplates + .Where(y => y.Categories.Any(z => z.ActivityCategoryId == x.Id) + && y.ActivityTemplateState == ActivityTemplateState.Active) + .GroupBy(y => y.Name) + .Select(y => y.OrderByDescending(z => int.Parse(z.Version)).First()) + .Select(Mapper.Map<ActivityTemplateDTO>) + .ToList() }) .ToList(); - return curActivityTemplates; + return result; } public IEnumerable<ActivityTemplateCategoryDTO> GetActivityTemplatesGroupedByCategories() @@ -365,7 +405,7 @@ public IEnumerable<ActivityTemplateCategoryDTO> GetActivityTemplatesGroupedByCat .GetQuery() .Where(x => availableTerminalIds.Contains(x.TerminalId) && x.Categories != null) .SelectMany(x => x.Categories) - .Select(x => new { x.ActivityCategory.Name, x.ActivityCategory.IconPath }) + .Select(x => new { x.ActivityCategory.Id, x.ActivityCategory.Name, x.ActivityCategory.IconPath }) .OrderBy(x => x.Name) .Distinct() .ToList(); @@ -373,6 +413,7 @@ public IEnumerable<ActivityTemplateCategoryDTO> GetActivityTemplatesGroupedByCat var result = categories .Select(x => new ActivityTemplateCategoryDTO() { + Id = x.Id, Name = x.Name, IconPath = x.IconPath, Activities = _activityTemplate.GetQuery() diff --git a/Hub/Services/Terminal.cs b/Hub/Services/Terminal.cs index 287bc21c52..408fd4ade8 100644 --- a/Hub/Services/Terminal.cs +++ b/Hub/Services/Terminal.cs @@ -25,7 +25,7 @@ namespace Hub.Services public class Terminal : ITerminal { private readonly ISecurityServices _securityServices; - private readonly Dictionary<int, TerminalDO> _terminals = new Dictionary<int, TerminalDO>(); + private readonly Dictionary<Guid, TerminalDO> _terminals = new Dictionary<Guid, TerminalDO>(); private bool _isInitialized; private string _serverUrl; @@ -84,7 +84,7 @@ private void LoadFromDb() } } - public TerminalDO GetByKey(int terminalId) + public TerminalDO GetByKey(Guid terminalId) { Initialize(); @@ -117,7 +117,7 @@ public TerminalDO GetByNameAndVersion(string name, string version) } } - public TerminalDO RegisterOrUpdate(TerminalDO terminalDo) + public TerminalDO RegisterOrUpdate(TerminalDO terminalDo, bool isUserInitiated) { if (terminalDo == null) { @@ -139,20 +139,20 @@ public TerminalDO RegisterOrUpdate(TerminalDO terminalDo) lock (_terminals) { - var isRegisterTerminal = false; - TerminalDO terminal; + var doRegisterTerminal = false; + TerminalDO terminal, existingTerminal; using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) { - var existingTerminal = uow.TerminalRepository.FindOne(x => x.Name == terminalDo.Name); - - if (existingTerminal == null) + if (terminalDo.Id == Guid.Empty) { - terminalDo.Id = 0; - uow.TerminalRepository.Add(existingTerminal = terminalDo); - isRegisterTerminal = true; + terminalDo.Id = Guid.NewGuid(); + uow.TerminalRepository.Add(terminalDo); + doRegisterTerminal = true; + existingTerminal = terminalDo; } else { + existingTerminal = uow.TerminalRepository.FindOne(x => x.Id == terminalDo.Id); // this is for updating terminal CopyPropertiesHelper.CopyProperties(terminalDo, existingTerminal, false, x => x.Name != "Id"); } @@ -163,13 +163,16 @@ public TerminalDO RegisterOrUpdate(TerminalDO terminalDo) _terminals[existingTerminal.Id] = terminal; } - if (isRegisterTerminal) + if (doRegisterTerminal) { - //add ownership for this new terminal to current user - _securityServices.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, terminal.Id.ToString(), nameof(TerminalDO), new List<PermissionType>() { PermissionType.UseTerminal }); + if (isUserInitiated) + { + //add ownership for this new terminal to current user + _securityServices.SetDefaultRecordBasedSecurityForObject(Roles.OwnerOfCurrentObject, terminal.Id, nameof(TerminalDO), new List<PermissionType>() { PermissionType.UseTerminal }); + } //make it visible for Fr8 Admins - _securityServices.SetDefaultRecordBasedSecurityForObject(Roles.Admin, terminal.Id.ToString(), nameof(TerminalDO), new List<PermissionType>() { PermissionType.UseTerminal }); + _securityServices.SetDefaultRecordBasedSecurityForObject(Roles.Admin, terminal.Id, nameof(TerminalDO), new List<PermissionType>() { PermissionType.UseTerminal }); } return terminal; diff --git a/Hub/Services/TerminalDiscoveryService.cs b/Hub/Services/TerminalDiscoveryService.cs index 2f3d24a02e..f691a26e32 100644 --- a/Hub/Services/TerminalDiscoveryService.cs +++ b/Hub/Services/TerminalDiscoveryService.cs @@ -14,6 +14,13 @@ using Hub.Managers; using log4net; using Microsoft.AspNet.Identity; +using Data.States; +using Data.Infrastructure.StructureMap; +using Fr8.Infrastructure.Data.States; +using Fr8.Infrastructure.Data.DataTransferObjects; +using System.Linq.Expressions; +using Hub.Exceptions; +using StructureMap; namespace Hub.Services { @@ -28,14 +35,23 @@ public class TerminalDiscoveryService : ITerminalDiscoveryService private readonly IUnitOfWorkFactory _unitOfWorkFactory; private readonly string _serverUrl; private readonly HashSet<string> _knownTerminals = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); - - public TerminalDiscoveryService(IActivityTemplate activityTemplateService, ITerminal terminal, IRestfulServiceClient restfulServiceClient, EventReporter eventReporter, IUnitOfWorkFactory unitOfWorkFactory, IConfigRepository configRepository) + private readonly ISecurityServices _securityService; + + public TerminalDiscoveryService( + IActivityTemplate activityTemplateService, + ITerminal terminal, + IRestfulServiceClient restfulServiceClient, + EventReporter eventReporter, + IUnitOfWorkFactory unitOfWorkFactory, + IConfigRepository configRepository, + ISecurityServices securityService) { _activityTemplateService = activityTemplateService; _terminal = terminal; _restfulServiceClient = restfulServiceClient; _eventReporter = eventReporter; _unitOfWorkFactory = unitOfWorkFactory; + _securityService = securityService; var serverProtocol = configRepository.Get("ServerProtocol", String.Empty); var domainName = configRepository.Get("ServerDomainName", String.Empty); @@ -65,60 +81,179 @@ public TerminalDiscoveryService(IActivityTemplate activityTemplateService, ITerm } } - public async Task RegisterTerminal(string endpoint) + public async Task SaveOrRegister(TerminalDTO terminal) { - if (string.IsNullOrWhiteSpace(endpoint)) + string curEndpoint = string.Empty; + + // Get the value of TerminalDTO.ParticipationState which we can trust + int safeParticipationState; + if (UserHasTerminalAdministratorPermission()) { - throw new ArgumentException("Invalid url", nameof(endpoint)); + // We can trust Fr8 administrator (and he/she can change ParticipationState) so just get it from DTO + safeParticipationState = terminal.ParticipationState; } + else + { + if (terminal.InternalId == Guid.Empty) + { + // For new terminals the value is 0 (Unapproved) + safeParticipationState = ParticipationState.Unapproved; + } + else + { + // We cannot trust user so get the value from the DB + using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) + { + var terminalTempDo = uow.TerminalRepository.GetByKey(terminal.InternalId); //TODO: check user permissions here!! + if (terminalTempDo == null) + { + throw new ArgumentOutOfRangeException($"Terminal with the id {terminal.InternalId} is not found.", nameof(terminal.InternalId)); + } + safeParticipationState = terminalTempDo.ParticipationState; + } + } + } + terminal.ParticipationState = safeParticipationState; - Logger.Info($"Registration of terminal at '{endpoint}' is requested."); - - endpoint = ExtractTerminalAuthority(endpoint); + // Validate data + if (terminal.ParticipationState == ParticipationState.Approved) + { + if (string.IsNullOrWhiteSpace(terminal.ProdUrl)) + { + throw new ArgumentNullException("Production endpoint must be specified for the terminals in the Approved state.", nameof(terminal.ProdUrl)); + } + curEndpoint = NormalizeUrl(terminal.ProdUrl); + } + else if (terminal.ParticipationState == ParticipationState.Unapproved) + { + if (string.IsNullOrWhiteSpace(terminal.DevUrl)) + { + throw new ArgumentNullException("Development endpoint must be specified for the terminals in the Unapproved state.", nameof(terminal.DevUrl)); + } + curEndpoint = NormalizeUrl(terminal.DevUrl); + } + else + { + curEndpoint = string.Empty; + } +#if DEBUG + // Use local URL for Fr8 own terminals when in the local environment or during FBB tests. + if (terminal.IsFr8OwnTerminal) + { + curEndpoint = NormalizeUrl(terminal.DevUrl); + } +#endif - using (var uow = _unitOfWorkFactory.Create()) + if (!UserHasTerminalAdministratorPermission()) { - var terminalRegistration = new TerminalRegistrationDO(); + // Developer cannot add terminals with the "localhost" endpoint, + // or set it while editing, or assign a terminal the Fr8OwnTerminal flag, + // or edit the terminal with such a flag. + // User must be an administrator to add or edit a Fr8 own terminal. + if ((new Uri(curEndpoint).Host == "localhost")) + { + throw new InvalidOperationException("Insufficient permissions to add a 'localhost' endpoint."); + } - if (uow.TerminalRegistrationRepository.GetAll().FirstOrDefault(x => string.Equals(ExtractTerminalAuthority(x.Endpoint), endpoint, StringComparison.OrdinalIgnoreCase)) != null) + if (terminal.IsFr8OwnTerminal) { - Logger.Error($"Terminal with endpoint '{endpoint}' was already registered"); - throw new Exception($"Terminal with endpoint '{endpoint}' was already registered"); + throw new InvalidOperationException("Insufficient permissions to manage a Fr8Own terminal."); } + } + + Logger.Info($"Registration of terminal at '{curEndpoint}' is requested."); + + var terminalDo = new TerminalDO(); + terminalDo.Endpoint = terminal.Endpoint = curEndpoint; + + //Check whether we save an existing terminal or register a new one + if (terminal.InternalId == Guid.Empty) + { + // New terminal + if (IsExistingTerminal(curEndpoint)) + { + Logger.Error($"Terminal with endpoint '{curEndpoint}' was already registered"); + throw new ConflictException(nameof(TerminalDO), nameof(TerminalDO.Endpoint), curEndpoint); + } + + terminalDo.TerminalStatus = TerminalStatus.Undiscovered; - terminalRegistration.UserId = Thread.CurrentPrincipal.Identity.GetUserId(); - terminalRegistration.Endpoint = endpoint.ToLower(); + // The 'Endpoint' property contains the currently active endpoint which may be changed + // by deployment scripts or by promoting the terminal from Dev to Production + // while ProdUrl/DevUrl contains whatever user or administrator have supplied. - // Consider terminal to be Fr8's if endpoint is "localhost". - // This assumption may be changed in the future. - if (new Uri(terminalRegistration.Endpoint).Host == "localhost") + // Set properties which can be safely set by any user + terminalDo.DevUrl = terminal.DevUrl; + + if (UserHasTerminalAdministratorPermission()) + { + // Set properties which can only be set by Administrator + terminalDo.ParticipationState = terminal.ParticipationState; + terminalDo.IsFr8OwnTerminal = terminal.IsFr8OwnTerminal; + terminalDo.ProdUrl = terminal.ProdUrl; + } + else { - terminalRegistration.IsFr8OwnTerminal = true; + // If a Developer adds a terminal, it has to be approved by Fr8 Administrator + terminalDo.ParticipationState = ParticipationState.Unapproved; } - var normaizedEndpoint = NormalizeTerminalEndpoint(endpoint); + terminalDo.UserId = Thread.CurrentPrincipal.Identity.GetUserId(); + Logger.Info($"Terminal at '{curEndpoint}' was successfully registered."); + + } + else + { + // An existing terminal + terminalDo.Id = terminal.InternalId; + terminalDo.DevUrl = terminal.DevUrl; - if (!await DiscoverInternal(normaizedEndpoint)) + //Administrator can update production URL and ParticipationState + if (UserHasTerminalAdministratorPermission()) { - throw new Exception($"Unable to discover terminal at '{normaizedEndpoint}'"); + terminalDo.ProdUrl = terminal.ProdUrl; + terminalDo.ParticipationState = terminal.ParticipationState; + terminalDo.IsFr8OwnTerminal = terminal.IsFr8OwnTerminal; } + } + + terminalDo = _terminal.RegisterOrUpdate(terminalDo, true); + Logger.Info($"Terminal at '{curEndpoint}' was successfully registered."); + + if (!await DiscoverInternal(curEndpoint, true)) + { + Logger.Info($"The terminal at {curEndpoint} has been registered but an error has occurred while carrying out discovery."); + } + } + + private bool IsExistingTerminal(string endpoint) + { + using (var uow = _unitOfWorkFactory.Create()) + { + string authority = new Uri(endpoint).Authority; + + Func<TerminalDO, bool> predicate = x => + string.Equals((new Uri(x.DevUrl).Authority), authority, StringComparison.OrdinalIgnoreCase) || + string.Equals((new Uri(x.ProdUrl).Authority), authority, StringComparison.OrdinalIgnoreCase); - uow.TerminalRegistrationRepository.Add(terminalRegistration); - uow.SaveChanges(); + return uow.TerminalRepository.GetAll().Any(predicate); } + } - Logger.Info($"Terminal at '{endpoint}' was successfully registered."); + private bool UserHasTerminalAdministratorPermission() + { + return _securityService.UserHasPermission(PermissionType.EditAllObjects, "TerminalDO"); } - public async Task Discover() + public async Task DiscoverAll() { var terminalUrls = ListTerminalEndpoints(); - var discoverTerminalsTasts = terminalUrls.Select(x => DiscoverInternal(NormalizeTerminalEndpoint(x))).ToArray(); + var discoverTerminalsTasks = terminalUrls.Select(x => DiscoverInternal(NormalizeUrl(x), false)).ToArray(); - await Task.WhenAll(discoverTerminalsTasts); + await Task.WhenAll(discoverTerminalsTasks); } - public async Task<bool> Discover(string terminalUrl) + public async Task<bool> Discover(string terminalUrl, bool isUserInitiated) { Logger.Info($"Discovering of terminal at '{terminalUrl}' was requested..."); @@ -129,46 +264,55 @@ public async Task<bool> Discover(string terminalUrl) { if (!_knownTerminals.Contains(uri.Authority)) { - Logger.Info($"Terminalat at '{terminalUrl}' was not registered within the Hub. Discovery request declied."); + Logger.Info($"Terminal at at '{terminalUrl}' was not registered within the Hub. Discovery request declied."); return false; } } - return await DiscoverInternal(NormalizeTerminalEndpoint(terminalUrl)); + return await DiscoverInternal(NormalizeUrl(terminalUrl), isUserInitiated); } - private static string ExtractTerminalAuthority(string terminalUrl) + private static string NormalizeUrl(string terminalUrl) { - string terminalAuthority = terminalUrl; - if (!terminalUrl.Contains("http:") & !terminalUrl.Contains("https:")) { - terminalAuthority = "http://" + terminalUrl.TrimStart('\\', '/'); + terminalUrl = "http://" + terminalUrl.TrimStart('\\', '/'); } - var discoverOp = terminalAuthority.IndexOf("/discover", StringComparison.OrdinalIgnoreCase); - - if (discoverOp > 0) - { - terminalAuthority = terminalAuthority.Substring(0, discoverOp); - } - - return terminalAuthority.TrimEnd('\\', '/'); + return terminalUrl; } - private async Task<bool> DiscoverInternal(string terminalUrl) + private async Task<bool> DiscoverInternal(string terminalUrl, bool isUserInitiated) { Logger.Info($"Starting discovering terminal at '{terminalUrl}'. Reporting about self as the Hub at '{_serverUrl}'."); + bool result = false; try { string secret = null; - var terminalAuthority = ExtractTerminalAuthority(terminalUrl); - var exisitingTerminal = _terminal.GetAll().FirstOrDefault(x => string.Equals(ExtractTerminalAuthority(x.Endpoint), terminalAuthority, StringComparison.OrdinalIgnoreCase)); + var terminalDo = _terminal.GetAll().FirstOrDefault(x => string.Equals(NormalizeUrl(x.Endpoint), NormalizeUrl(terminalUrl), StringComparison.OrdinalIgnoreCase)); + + if (terminalDo == null) + { + Logger.Info($"Discovery for terminal '{terminalUrl}' failed: the provided Endpoint is not found in the Endpoint field of any of the existing Terminal entries."); + return false; + } - if (!string.IsNullOrWhiteSpace(exisitingTerminal?.Secret)) + if (terminalDo.ParticipationState == ParticipationState.Blocked) { - secret = exisitingTerminal.Secret; + Logger.Info($"Discovery for terminal '{terminalUrl}' will not happen because the terminal is blocked."); + return false; + } + + if (terminalDo.ParticipationState == ParticipationState.Deleted) + { + Logger.Info($"Discovery for terminal '{terminalUrl}' will not happen because the terminal is deleted."); + return false; + } + + if (!string.IsNullOrWhiteSpace(terminalDo?.Secret)) + { + secret = terminalDo.Secret; } if (secret == null) @@ -183,44 +327,67 @@ private async Task<bool> DiscoverInternal(string terminalUrl) { "Fr8HubCallBackUrl", _serverUrl} }; - var terminalRegistrationInfo = await _restfulServiceClient.GetAsync<StandardFr8TerminalCM>(new Uri(terminalUrl, UriKind.Absolute), null, headers); + StandardFr8TerminalCM terminalRegistrationInfo = null; - if (terminalRegistrationInfo == null) + try { - Logger.Error($"Terminal at '{terminalUrl}' didn't return meaningfull reply for discovery request."); - throw new Exception($"Terminal at '{terminalUrl}' didn't return meaningfull reply for discovery request."); + terminalRegistrationInfo = await _restfulServiceClient.GetAsync<StandardFr8TerminalCM>(new Uri(terminalUrl + "/discover", UriKind.Absolute), null, headers); } - - var activityTemplates = terminalRegistrationInfo.Activities.Select(Mapper.Map<ActivityTemplateDO>).ToList(); - - var terminal = Mapper.Map<TerminalDO>(terminalRegistrationInfo.Definition); - - terminal.Secret = secret; - - if (string.IsNullOrWhiteSpace(terminal.Label)) + catch (Exception ex) { - terminal.Label = terminal.Name; + _eventReporter.ActivityTemplateTerminalRegistrationError($"Failed terminal service: {terminalUrl}. Error Message: {ex.Message} ", ex.GetType().Name); + terminalRegistrationInfo = null; } - terminal = _terminal.RegisterOrUpdate(terminal); - - foreach (var curItem in activityTemplates) + if (terminalRegistrationInfo == null) { - Logger.Error($"Registering activity '{curItem.Name}' from terminal at '{terminalUrl}'"); - try + // Discovery failed + Logger.Error($"Terminal at '{terminalUrl}' didn't return a valid response to the discovery request."); + // Set terminal status inactive + terminalDo.OperationalState = OperationalState.Inactive; + result = false; + } + else + { + terminalDo.OperationalState = OperationalState.Active; + terminalDo.AuthenticationType = terminalRegistrationInfo.Definition.AuthenticationType; + terminalDo.Description = terminalRegistrationInfo.Definition.Description; + terminalDo.Label = terminalRegistrationInfo.Definition.Label; + terminalDo.Name = terminalRegistrationInfo.Definition.Name; + terminalDo.Version = terminalRegistrationInfo.Definition.Version; + terminalDo.TerminalStatus = terminalRegistrationInfo.Definition.TerminalStatus; + + terminalDo.Secret = secret; + if (string.IsNullOrWhiteSpace(terminalDo.Label)) { - curItem.Terminal = terminal; - curItem.TerminalId = terminal.Id; - - _activityTemplateService.RegisterOrUpdate(curItem); + terminalDo.Label = terminalDo.Name; } - catch (Exception ex) + result = true; + } + terminalDo = _terminal.RegisterOrUpdate(terminalDo, isUserInitiated); + + if (result) + { + var activityTemplates = terminalRegistrationInfo.Activities.Select(Mapper.Map<ActivityTemplateDO>).ToList(); + foreach (var curItem in activityTemplates) { - _eventReporter.ActivityTemplateTerminalRegistrationError($"Failed to register {curItem.Terminal.Name} terminal. Error Message: {ex.Message}", ex.GetType().Name); + Logger.Info($"Registering activity '{curItem.Name}' from terminal at '{terminalUrl}'"); + try + { + curItem.Terminal = terminalDo; + curItem.TerminalId = terminalDo.Id; + + _activityTemplateService.RegisterOrUpdate(curItem); + } + catch (Exception ex) + { + _eventReporter.ActivityTemplateTerminalRegistrationError($"Failed to register {curItem.Terminal.Name} terminal. Error Message: {ex.Message}", ex.GetType().Name); + } } - } - _activityTemplateService.RemoveInactiveActivities(activityTemplates); + _activityTemplateService.RemoveInactiveActivities(terminalDo, activityTemplates); + } + return result; } catch (Exception ex) { @@ -239,20 +406,13 @@ private async Task<bool> DiscoverInternal(string terminalUrl) return true; } - private string NormalizeTerminalEndpoint(string endpoint) - { - var authority = ExtractTerminalAuthority(endpoint); - - return authority.ToLower() + "/discover"; - } - private string[] ListTerminalEndpoints() { var terminalUrls = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); using (var uow = _unitOfWorkFactory.Create()) { - foreach (var terminalRegistration in uow.TerminalRegistrationRepository.GetAll()) + foreach (var terminalRegistration in uow.TerminalRepository.GetAll()) { terminalUrls.Add(terminalRegistration.Endpoint); } diff --git a/Hub/Services/Utilization/ActivityExecutionRateLimitingService.cs b/Hub/Services/Utilization/ActivityExecutionRateLimitingService.cs index bb21b18053..6c3c199b02 100644 --- a/Hub/Services/Utilization/ActivityExecutionRateLimitingService.cs +++ b/Hub/Services/Utilization/ActivityExecutionRateLimitingService.cs @@ -140,6 +140,7 @@ private void NotifyUser(IUnitOfWork uow, string user) _pusherNotifier.NotifyUser( new NotificationMessageDTO { NotificationType = NotificationType.GenericFailure, + Subject = "Plan Failed", Message = "You are running more Activities than your capacity right now. " + $"This Account will be prevented from processing Activities for the next {Math.Ceiling(_userBanTime.TotalSeconds / 60.0f)} minutes. " + "Contact support@fr8.co for assistance", diff --git a/Services/PlanDirectory/Infrastructure/PlanDirectoryBootstrapper.cs b/Hub/StructureMap/PlanDirectoryBootstrapper.cs similarity index 70% rename from Services/PlanDirectory/Infrastructure/PlanDirectoryBootstrapper.cs rename to Hub/StructureMap/PlanDirectoryBootstrapper.cs index 13d883974a..5de65eff8f 100644 --- a/Services/PlanDirectory/Infrastructure/PlanDirectoryBootstrapper.cs +++ b/Hub/StructureMap/PlanDirectoryBootstrapper.cs @@ -7,7 +7,7 @@ using Fr8.Infrastructure.Utilities.Configuration; using Hub.Interfaces; using Hub.Services; -using PlanDirectory.Interfaces; +using Hub.Services.PlanDirectory; using StructureMap; using StructureMap.Configuration.DSL; @@ -20,34 +20,25 @@ public class LiveMode : Registry public LiveMode() { For<IFr8Account>().Use<Fr8Account>().Singleton(); - For<IAuthTokenManager>().Use<AuthTokenManager>().Singleton(); - For<IPlanTemplate>().Use<PlanTemplate>().Singleton(); - For<ISearchProvider>().Use<SearchProvider>(); - For<ITagGenerator>().Use<TagGenerator>().Singleton(); - For<IPageDefinition>().Use<PageDefinition>().Singleton(); For<IPageDefinitionRepository>().Use<PageDefinitionRepository>().Singleton(); - For<IHubCommunicatorFactory>().Use( - x => new PlanDirectoryHubCommunicatorFactory( - ObjectFactory.GetInstance<IRestfulServiceClientFactory>(), - CloudConfigurationManager.GetSetting("HubApiBaseUrl"), - CloudConfigurationManager.GetSetting("PlanDirectorySecret") - ) - ); + var serverPath = GetServerPath(); + var planDirectoryUrl = new Uri(CloudConfigurationManager.GetSetting("PlanDirectoryUrl")); + ConfigureManifestPageGenerator(planDirectoryUrl, serverPath); ConfigurePlanPageGenerator(planDirectoryUrl, serverPath); } private void ConfigurePlanPageGenerator(Uri planDirectoryUrl, string serverPath) { - var templateGenerator = new TemplateGenerator(new Uri($"{planDirectoryUrl}category"), $"{serverPath}/category"); + var templateGenerator = new TemplateGenerator(new Uri($"{planDirectoryUrl}/categorypages"), $"{serverPath}/categorypages"); For<IWebservicesPageGenerator>().Use<WebservicesPageGenerator>().Singleton().Ctor<ITemplateGenerator>().Is(templateGenerator); } private void ConfigureManifestPageGenerator(Uri planDirectoryUrl, string serverPath) { - var templateGenerator = new TemplateGenerator(new Uri($"{planDirectoryUrl}manifestpages"), $"{serverPath}/manifestpages"); + var templateGenerator = new TemplateGenerator(new Uri($"{planDirectoryUrl}/manifestpages"), $"{serverPath}/manifestpages"); For<IManifestPageGenerator>().Use<ManifestPageGenerator>().Singleton().Ctor<ITemplateGenerator>().Is(templateGenerator); } diff --git a/Hub/StructureMap/StructureMapBootStrapper.cs b/Hub/StructureMap/StructureMapBootStrapper.cs index 46b631f285..f668ef12f0 100644 --- a/Hub/StructureMap/StructureMapBootStrapper.cs +++ b/Hub/StructureMap/StructureMapBootStrapper.cs @@ -34,6 +34,7 @@ using Fr8.Infrastructure.Interfaces; using Fr8.Infrastructure.Utilities; using Hub.Security.ObjectDecorators; +using Hub.Services.PlanDirectory; using Hub.Services.Timers; namespace Hub.StructureMap @@ -126,6 +127,15 @@ public LiveMode() For<ITimer>().Use<Win32Timer>(); For<IManifestRegistryMonitor>().Use<ManifestRegistryMonitor>().Singleton(); For<IUpstreamDataExtractionService>().Use<UpstreamDataExtractionService>().Singleton(); + + + //PD services + For<ITagGenerator>().Use<TagGenerator>().Singleton(); + For<IPlanTemplate>().Use<PlanTemplate>().Singleton(); + For<ISearchProvider>().Use<SearchProvider>().Singleton(); + For<IPageDefinition>().Use<PageDefinition>().Singleton(); + //For<IPageDefinitionRepository>().Use<PageDefinitionRepository>().Singleton(); + For<IPlanDirectoryService>().Use<PlanDirectoryService>().Singleton(); } @@ -199,6 +209,19 @@ public TestMode() For<IActivityExecutionRateLimitingService>().Use<ActivityExecutionRateLimitingService>().Singleton(); For<ITimer>().Use<Win32Timer>(); For<IUpstreamDataExtractionService>().Use<UpstreamDataExtractionService>().Singleton(); + + //PD bootstrap + //tony.yakovets: will it work? or some tests check generated templates? + var templateGenerator = new Mock<ITemplateGenerator>().Object; + For<IWebservicesPageGenerator>().Use<WebservicesPageGenerator>().Singleton().Ctor<ITemplateGenerator>().Is(templateGenerator); + For<IManifestPageGenerator>().Use<ManifestPageGenerator>().Singleton().Ctor<ITemplateGenerator>().Is(templateGenerator); + + For<ITagGenerator>().Use<TagGenerator>().Singleton(); + For<IPlanTemplate>().Use<PlanTemplate>().Singleton(); + For<ISearchProvider>().Use<SearchProvider>().Singleton(); + For<IPageDefinition>().Use<PageDefinition>().Singleton(); + For<ITemplateGenerator>().Use<TemplateGenerator>().Singleton(); + For<IPlanDirectoryService>().Use<PlanDirectoryService>().Singleton(); } } @@ -245,12 +268,12 @@ public TerminalDO GetByNameAndVersion(string name, string version) return _terminal.GetByNameAndVersion(name, version); } - public TerminalDO RegisterOrUpdate(TerminalDO terminalDo) + public TerminalDO RegisterOrUpdate(TerminalDO terminalDo, bool isUserInitiated) { - return _terminal.RegisterOrUpdate(terminalDo); + return _terminal.RegisterOrUpdate(terminalDo, isUserInitiated); } - public TerminalDO GetByKey(int terminalId) + public TerminalDO GetByKey(Guid terminalId) { return _terminal.GetByKey(terminalId); } diff --git a/Hub/packages.config b/Hub/packages.config index 42f3f7bac6..02f33627fe 100644 --- a/Hub/packages.config +++ b/Hub/packages.config @@ -29,6 +29,7 @@ <package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" /> <package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" /> + <package id="Microsoft.Azure.Search" version="1.1.2" targetFramework="net45" /> <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" /> <package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" /> <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net45" /> @@ -38,6 +39,9 @@ <package id="Microsoft.Owin.Security" version="3.0.1" targetFramework="net45" /> <package id="Microsoft.Owin.Security.Cookies" version="3.0.1" targetFramework="net45" /> <package id="Microsoft.Owin.Security.OAuth" version="3.0.1" targetFramework="net45" /> + <package id="Microsoft.Rest.ClientRuntime" version="1.8.1" targetFramework="net45" /> + <package id="Microsoft.Rest.ClientRuntime.Azure" version="2.5.2" targetFramework="net45" /> + <package id="Microsoft.Spatial" version="6.13.0" targetFramework="net45" /> <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" /> <package id="Moq" version="4.2.1507.0118" targetFramework="net45" /> <package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" /> diff --git a/HubWeb.csproj b/HubWeb.csproj index f6364c0feb..8a0dd356df 100644 --- a/HubWeb.csproj +++ b/HubWeb.csproj @@ -168,6 +168,10 @@ <HintPath>packages\Microsoft.AspNet.Identity.Owin.2.0.0\lib\net45\Microsoft.AspNet.Identity.Owin.dll</HintPath> <Private>True</Private> </Reference> + <Reference Include="Microsoft.Azure.Search, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Azure.Search.1.1.2\lib\net45\Microsoft.Azure.Search.dll</HintPath> + <Private>True</Private> + </Reference> <Reference Include="Microsoft.Build" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="Microsoft.Owin, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> @@ -216,6 +220,18 @@ <HintPath>packages\CommonServiceLocator.1.2\lib\portable-windows8+net40+sl5+windowsphone8\Microsoft.Practices.ServiceLocation.dll</HintPath> <Private>True</Private> </Reference> + <Reference Include="Microsoft.Rest.ClientRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Rest.ClientRuntime.1.8.1\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Rest.ClientRuntime.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Rest.ClientRuntime.Azure.2.5.2\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Spatial, Version=6.13.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Spatial.6.13.0\lib\portable-net40+sl5+wp8+win8+wpa\Microsoft.Spatial.dll</HintPath> + <Private>True</Private> + </Reference> <Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <HintPath>packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath> <Private>True</Private> @@ -390,11 +406,14 @@ <Compile Include="Controllers\Api\ManifestRegistryController.cs" /> <Compile Include="Controllers\Api\ManifestsController.cs" /> <Compile Include="Controllers\Api\PageDefinitionsController.cs" /> + <Compile Include="Controllers\Api\PageGenerationController.cs" /> + <Compile Include="Controllers\Api\PlanTemplatesController.cs" /> <Compile Include="Controllers\Api\SubPlansController.cs" /> <Compile Include="Controllers\Api\PlansController.cs" /> <Compile Include="Controllers\Api\TerminalsController.cs" /> <Compile Include="Controllers\Api\WarehousesController.cs" /> <Compile Include="Controllers\CompanyController.cs" /> + <Compile Include="Controllers\PlanDirectoryController.cs" /> <Compile Include="Controllers\RedirectController.cs" /> <Compile Include="Controllers\ServicesController.cs" /> <Compile Include="Controllers\SupportController.cs" /> @@ -413,59 +432,10 @@ <Compile Include="DependencyResolution\IoC.cs" /> <Compile Include="DependencyResolution\StructureMapDependencyResolver.cs" /> <Compile Include="DependencyResolution\StructureMapDependencyScope.cs" /> - <Compile Include="Documentation\Swagger\DocumentFilters\AddDefaultValuesDocumentFilter.cs" /> - <Compile Include="Documentation\Swagger\DocumentFilters\RemoveDuplicatesDocumentFilter.cs" /> - <Compile Include="Documentation\Swagger\OperationFilters\RemoveParameterModelNameOperationFilter.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ActivitySampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ActivityTemplateSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenGrantSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenTerminalSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\AuthorizationTokenSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ContainerSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\CrateDescriptionSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\CrateSampeFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\CrateStorageSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\CredentialsSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\DocumentationResponseSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\FactSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\FieldSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\DocumentFilters\AddHubDefaultValuesDocumentFilter.cs" /> <Compile Include="Documentation\Swagger\SampleData\FileDOSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\FileSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\FilterConditionSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\FullSubplanSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\HistoryResultSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\IncidentSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\IncomingCratesSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ISwaggerSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ManifestDescriptionSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\OrganizationSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PageDefinitionSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PayloadSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PhoneNumberCredentialsSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PhoneNumberVerificationSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PlanEmptySampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PlanFullSampleFactory.cs" /> <Compile Include="Documentation\Swagger\SampleData\PlanPostParamsSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PlanQuerySampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PlanResultSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PlanSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\PollingDataSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ProfileSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\QuerySampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ResponseMessageSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\SubplanSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\TerminalNotificationSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\TerminalRegistrationSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\TerminalSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\TokenResponseSampleFactory.cs" /> <Compile Include="Documentation\Swagger\SampleData\TokenWrapperSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\UrlResponseSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\UserSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ValidationErrorsSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\ValidationResultSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\WebServiceActivitySetSampleFactory.cs" /> - <Compile Include="Documentation\Swagger\SampleData\WebServiceSampleFactory.cs" /> <Compile Include="ExceptionHandling\ExeceptionHandler.cs" /> <Compile Include="ExceptionHandling\Fr8ExceptionHandler.ErrorResult.cs" /> <Compile Include="ExceptionHandling\Fr8ExceptionHandler.cs" /> @@ -482,12 +452,20 @@ <Compile Include="Controllers\HomeController.cs" /> <Compile Include="Controllers\Api\ReportsController.cs" /> <Compile Include="Controllers\TokenAuthController.cs" /> + <Compile Include="Filters\RedirecLogedUserAttribute.cs" /> <Compile Include="Infrastructure_HubWeb\AngularTemplateCacheAttribute.cs" /> <Compile Include="Infrastructure_HubWeb\FileActionResult.cs" /> <Compile Include="Infrastructure_HubWeb\Fr8PlanDirectoryAuthenticationAttribute.cs" /> <Compile Include="Infrastructure_HubWeb\Fr8TerminalAuthenticationAttribute.cs" /> <Compile Include="Infrastructure_HubWeb\Fr8Identity.cs" /> <Compile Include="Infrastructure_HubWeb\HtmlHelpers.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\AuthTokenManager.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\HubAuthenticationPDHeaderSignature.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryAuthorizeAttribute.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryHMACAuthenticateAttribute.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryHubCommunicatorFactory.cs" /> + <Compile Include="Infrastructure_PD\Interfaces\IAuthTokenManager.cs" /> + <Compile Include="Infrastructure_PD\Interfaces\IHubCommunicatorFactory.cs" /> <Compile Include="SelfHostFactory.cs" /> <Compile Include="ViewModels\AuthenticationErrorVM.cs" /> <Compile Include="ViewModels\ForgotPasswordVM.cs" /> @@ -525,8 +503,11 @@ <Content Include="Content\css\homecss\font-awesome.min.css" /> <Content Include="Content\css\homecss\ie.css" /> <Content Include="Content\css\homecss\main.css" /> + <Content Include="Content\css\plan-category.css" /> + <Content Include="Content\css\plan-directory.css" /> <Content Include="Content\css\shared\main.css" /> <Content Include="Content\css\shared\navbar.css" /> + <Content Include="Content\css\shared\PlanDirectoryMain.css" /> <Content Include="Content\icons\forward-icon-64x64.png" /> <Content Include="Content\icons\get-icon-64x64.png" /> <Content Include="Content\icons\monitor-icon-64x64.png" /> @@ -564,6 +545,7 @@ <Content Include="Content\img\backgrounds\solution-bg.png" /> <Content Include="Content\img\icons\more_vert.svg" /> <Content Include="Content\img\logo-fr8.svg" /> + <Content Include="Content\img\logo.svg" /> <Content Include="Content\img\Management\Alexei_Avrutin.png" /> <Content Include="Content\img\Management\Alex_Edelstein_Round.png" /> <Content Include="Content\img\Management\Andrew_Cantino.png" /> @@ -654,6 +636,7 @@ <Content Include="Content\img\Management\Stuart_Gold.png" /> <Content Include="Content\img\MicrosoftExchangelogo.png" /> <Content Include="Content\img\minus.png" /> + <Content Include="Content\img\plan-bg.jpg" /> <Content Include="Content\img\plus.png" /> <Content Include="Content\img\PlanBuilder\action-add-small.png" /> <Content Include="Content\img\PlanBuilder\actions-node-bg.png" /> @@ -696,6 +679,11 @@ <Content Include="Content\img\welcome\DocuSign_Logo_Purple_Yellow.png" /> <Content Include="Content\img\welcome\header_green.png" /> <Content Include="Content\img\welcome\welcome_header.png" /> + <Content Include="Content\img\white-bg-overlay.png" /> + <Content Include="Content\metronic\components.css" /> + <Content Include="Content\metronic\jquery.blockui.min.js" /> + <Content Include="Content\metronic\loading.gif" /> + <Content Include="Content\metronic\ui.js" /> <Content Include="Content\videos\motion.mp4" /> <Content Include="Content\videos\motion.png" /> <Content Include="Content\videos\motion_1920.jpg" /> @@ -729,9 +717,17 @@ <Content Include="Scripts\PlanBuilder\pb-interfaces.js" /> <Content Include="Scripts\PlanBuilder\pb-resources.js" /> <Content Include="Scripts\PlanBuilder\pb-widget.js" /> + <Content Include="Scripts\PlanDirectoryApp.js" /> + <Content Include="Scripts\PlanDirectoryMain.js" /> <Content Include="Scripts\templateCache.js" /> + <Content Include="Scripts\tests\e2e\authorizationPathways\docusign.spec.js" /> + <Content Include="Scripts\tests\e2e\authorizationPathways\google.spec.js" /> + <Content Include="Scripts\tests\e2e\authorizationPathways\salesforce.spec.js" /> + <Content Include="Scripts\tests\e2e\authorizationPathways\slack.spec.js" /> <Content Include="Scripts\tests\e2e\conf.js" /> <Content Include="Scripts\tests\e2e\login\login.spec.js" /> + <Content Include="Scripts\tests\e2e\pages\myAccount.page.js" /> + <Content Include="Scripts\tests\e2e\pages\plans.page.js" /> <Content Include="Scripts\tests\e2e\registration\registration.spec.js" /> <Content Include="Scripts\tests\e2e\pages\login.page.js" /> <Content Include="Scripts\tests\e2e\pages\registration.page.js" /> @@ -816,6 +812,7 @@ <Content Include="Views\AngularTemplate\ActionPickerPanel.cshtml" /> <Content Include="Views\AngularTemplate\HeaderNav.cshtml" /> <Content Include="Config\HubWeb\Settings.config.readme" /> + <Content Include="LICENSE" /> <None Include="Views\AngularTemplate\Messages.cshtml" /> <Content Include="Scripts\dummyTemplates.js" /> <Content Include="_PowerShellScripts\Combine-Sources.ps1" /> @@ -867,6 +864,9 @@ <Content Include="_PowerShellScripts\Add-Repo.ps1" /> <Content Include="Views\AngularTemplate\PermissionsSetterModal.cshtml" /> <Content Include="Views\AngularTemplate\TerminalDetail.cshtml" /> + <Content Include="Views\AngularTemplate\TerminalPublishForm.cshtml" /> + <Content Include="Views\PlanDirectory\Index.cshtml" /> + <Content Include="_PowerShellScripts\Set-Endpoints.ps1" /> <None Include="_PowerShellScripts\Swap-CloudService.ps1" /> <Content Include="_PowerShellScripts\Update-HostnameInTerminalRegistration.ps1" /> <TypeScriptCompile Include="Scripts\app\controllers\FileDetailsController.ts" /> @@ -907,6 +907,8 @@ <TypeScriptCompile Include="Scripts\app\directives\ActivityHeader.ts" /> <TypeScriptCompile Include="Scripts\app\directives\SubplanHeader.ts" /> <TypeScriptCompile Include="Scripts\app\directives\Validators\ManifestDescriptionValidators.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\ParticipationState.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\PermissionType.ts" /> <TypeScriptCompile Include="Scripts\app\enums\NotificationType.ts" /> <TypeScriptCompile Include="Scripts\app\enums\UINotificationMessageStatus.ts" /> <TypeScriptCompile Include="Scripts\app\events\Fr8Events.ts" /> @@ -930,6 +932,7 @@ <TypeScriptCompile Include="Scripts\app\model\OrganizationDTO.ts" /> <TypeScriptCompile Include="Scripts\app\model\Profile.ts" /> <TypeScriptCompile Include="Scripts\app\model\SubordinateSubplan.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ActivityService.ts" /> <TypeScriptCompile Include="Scripts\app\services\AuthService.ts" /> <TypeScriptCompile Include="Scripts\app\services\ConfigureTrackerService.ts" /> <TypeScriptCompile Include="Scripts\app\services\FileDetailsService.ts" /> @@ -4330,6 +4333,7 @@ <Content Include="Views\AngularTemplate\_AddPayloadModal.cshtml" /> <None Include="Views\DocusignAuthCallback\Login.cshtml" /> <TypeScriptCompile Include="Scripts\tests\utils\services\fixture_CrateHelper.ts" /> + <TypeScriptCompile Include="Scripts\typings\angular-material\angular-material.d.ts" /> <TypeScriptCompile Include="Scripts\typings\angular-ui-bootstrap.d.ts" /> <TypeScriptCompile Include="Scripts\typings\angular-ui-router\angular-ui-router.d.ts" /> <TypeScriptCompile Include="Scripts\typings\angularjs\angular-mocks.d.ts" /> @@ -4358,10 +4362,12 @@ <ItemGroup> <Folder Include="App_Data\" /> <Folder Include="archive\" /> + <Folder Include="CategoryPages\" /> <Folder Include="Content\img\forms\" /> <Folder Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\angular-file-upload\uploads\" /> <Folder Include="Content\templates\metronic\demo\" /> <Folder Include="Controllers\Templates\" /> + <Folder Include="ManifestPages\" /> <Folder Include="Scripts\app\directives\filters\" /> <Folder Include="Scripts\tests\templates\" /> <Folder Include="ViewModelServices\" /> @@ -4386,6 +4392,7 @@ </ProjectReference> </ItemGroup> <ItemGroup> + <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" /> <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> </ItemGroup> <ItemGroup> @@ -4471,7 +4478,7 @@ <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> </PropertyGroup> <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> - <Error Condition="!Exists('packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets'))" /> + <Error Condition="!Exists('packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets'))" /> </Target> <PropertyGroup> <CopyAllFilesToSingleFolderForPackageDependsOn> @@ -4558,4 +4565,5 @@ <RestoreSettingsTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" ProjectName="$(ProjectName)" /> </Target> <Import Project="packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets" Condition="Exists('packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets')" /> + <Import Project="packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets" Condition="Exists('packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets')" /> </Project> \ No newline at end of file diff --git a/HubWeb.csproj.orig b/HubWeb.csproj.orig new file mode 100644 index 0000000000..3b879462cd --- /dev/null +++ b/HubWeb.csproj.orig @@ -0,0 +1,4614 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.Default.props')" /> + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion> + </ProductVersion> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{F7BD7117-4F1D-4215-B338-61EBDD0D0BFE}</ProjectGuid> + <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids> + <OutputType>Library</OutputType> + <AppDesignerFolder>Properties</AppDesignerFolder> + <RootNamespace>HubWeb</RootNamespace> + <AssemblyName>HubWeb</AssemblyName> + <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> + <MvcBuildViews>true</MvcBuildViews> + <UseIISExpress>false</UseIISExpress> + <IISExpressSSLPort>44301</IISExpressSSLPort> + <IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication> + <IISExpressWindowsAuthentication>disabled</IISExpressWindowsAuthentication> + <IISExpressUseClassicPipelineMode>false</IISExpressUseClassicPipelineMode> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">.\</SolutionDir> + <UseGlobalApplicationHostFile /> + <TypeScriptToolsVersion>1.8</TypeScriptToolsVersion> + <RestorePackages>true</RestorePackages> + <ApplicationInsightsResourceId> + </ApplicationInsightsResourceId> + <NuGetPackageImportStamp> + </NuGetPackageImportStamp> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <Optimize>false</Optimize> + <OutputPath>bin\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\HubWeb.XML</DocumentationFile> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> + <DebugType>pdbonly</DebugType> + <Optimize>true</Optimize> + <OutputPath>bin\</OutputPath> + <DefineConstants>TRACE;RELEASE</DefineConstants> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <DocumentationFile>bin\HubWeb.XML</DocumentationFile> + </PropertyGroup> + <PropertyGroup> + <DeployOnBuild Condition=" '$(DeployHub)'!='' ">$(DeployHub)</DeployOnBuild> + </PropertyGroup> + <ItemGroup> + <Reference Include="Analytics.NET, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Analytics.2.0.0\lib\Analytics.NET.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Antlr3.Runtime, Version=3.5.0.2, Culture=neutral, PublicKeyToken=eb42632606e9261f, processorArchitecture=MSIL"> + <HintPath>packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="AutoMapper, Version=4.0.4.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL"> + <HintPath>packages\AutoMapper.4.0.4\lib\net45\AutoMapper.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="BouncyCastle.Crypto, Version=1.7.4137.9688, Culture=neutral, PublicKeyToken=a4292a325f69b123, processorArchitecture=MSIL"> + <HintPath>packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="DayPilot.Web.Mvc"> + <HintPath>lib\DayPilot.Web.Mvc.dll</HintPath> + </Reference> + <Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>packages\EntityFramework.6.1.0\lib\net45\EntityFramework.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"> + <HintPath>packages\EntityFramework.6.1.0\lib\net45\EntityFramework.SqlServer.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Excel, Version=2.1.2.3, Culture=neutral, PublicKeyToken=93517dbe6a4012fa, processorArchitecture=MSIL"> + <HintPath>packages\ExcelDataReader.2.1.2.3\lib\net45\Excel.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="FluentValidation, Version=5.6.2.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\FluentValidation.5.6.2.0\lib\Net45\FluentValidation.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="FluentValidation.Mvc, Version=5.6.2.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\FluentValidation.MVC5.5.6.2.0\lib\Net45\FluentValidation.Mvc.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="FluentValidation.WebApi, Version=5.6.2.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\FluentValidation.WebApi.5.6.2.0\lib\Net45\FluentValidation.WebApi.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Fr8.AI.DependencyCollector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f23a46de0be5d6f3, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>Utilities\Fr8.AI.DependencyCollector.dll</HintPath> + </Reference> + <Reference Include="Hangfire.Core, Version=1.6.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Hangfire.Core.1.6.0-beta2\lib\net45\Hangfire.Core.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Hangfire.SqlServer, Version=1.6.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Hangfire.SqlServer.1.6.0-beta2\lib\net45\Hangfire.SqlServer.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Hangfire.StructureMap, Version=1.5.3.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Hangfire.StructureMap3.1.5.3\lib\net45\Hangfire.StructureMap.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL"> + <HintPath>packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL"> + <HintPath>packages\log4net.2.0.5\lib\net45-full\log4net.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="LogentriesCore, Version=2.4.4.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\logentries.core.2.4.4\lib\net40\LogentriesCore.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="LogentriesLog4net, Version=2.4.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\logentries.log4net.2.4.2\lib\net40\LogentriesLog4net.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AI.Agent.Intercept, Version=1.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.Agent.Intercept.1.2.1\lib\net45\Microsoft.AI.Agent.Intercept.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AI.PerfCounterCollector, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.PerfCounterCollector.2.0.0\lib\net45\Microsoft.AI.PerfCounterCollector.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AI.ServerTelemetryChannel, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.2.0.0\lib\net45\Microsoft.AI.ServerTelemetryChannel.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AI.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.Web.2.0.0\lib\net45\Microsoft.AI.Web.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AI.WindowsServer, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.WindowsServer.2.0.0\lib\net45\Microsoft.AI.WindowsServer.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.ApplicationInsights, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.2.0.0\lib\net45\Microsoft.ApplicationInsights.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.ApplicationInsights.Log4NetAppender, Version=1.2.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.ApplicationInsights.Log4NetAppender.1.2.6\lib\net45\Microsoft.ApplicationInsights.Log4NetAppender.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AspNet.Identity.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Identity.Core.2.0.0\lib\net45\Microsoft.AspNet.Identity.Core.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AspNet.Identity.EntityFramework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Identity.EntityFramework.2.0.0\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.AspNet.Identity.Owin, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Identity.Owin.2.0.0\lib\net45\Microsoft.AspNet.Identity.Owin.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Azure.Search, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Azure.Search.1.1.2\lib\net45\Microsoft.Azure.Search.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Build" /> + <Reference Include="Microsoft.CSharp" /> + <Reference Include="Microsoft.Owin, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Host.HttpListener, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Host.HttpListener.3.0.1\lib\net45\Microsoft.Owin.Host.HttpListener.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Host.SystemWeb, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Hosting"> + <HintPath>packages\Microsoft.Owin.Hosting.3.0.1\lib\net45\Microsoft.Owin.Hosting.dll</HintPath> + </Reference> + <Reference Include="Microsoft.Owin.Security, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Security.Cookies, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Security.Facebook, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Security.Facebook.3.0.1\lib\net45\Microsoft.Owin.Security.Facebook.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Security.MicrosoftAccount, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Security.MicrosoftAccount.3.0.1\lib\net45\Microsoft.Owin.Security.MicrosoftAccount.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Security.OAuth, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Security.OAuth.3.0.1\lib\net45\Microsoft.Owin.Security.OAuth.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Owin.Security.Twitter, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Owin.Security.Twitter.3.0.1\lib\net45\Microsoft.Owin.Security.Twitter.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Practices.ServiceLocation, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\CommonServiceLocator.1.2\lib\portable-windows8+net40+sl5+windowsphone8\Microsoft.Practices.ServiceLocation.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Rest.ClientRuntime, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Rest.ClientRuntime.1.8.1\lib\net45\Microsoft.Rest.ClientRuntime.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Rest.ClientRuntime.Azure, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Rest.ClientRuntime.Azure.2.5.2\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Spatial, Version=6.13.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Spatial.6.13.0\lib\portable-net40+sl5+wp8+win8+wpa\Microsoft.Spatial.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Threading.Tasks.Extensions, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Microsoft.WindowsAzure.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.WindowsAzure.ConfigurationManager.2.0.1.0\lib\net40\Microsoft.WindowsAzure.Configuration.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> + <HintPath>packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Owin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0ebd12fd5e55cc5, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\Owin.1.0\lib\net40\Owin.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="PhoneNumbers, Version=7.0.9.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\libphonenumber-csharp.7.2.5\lib\PhoneNumbers.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="PusherServer, Version=2.1.1.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\PusherServer.2.1.1.0\lib\net35\PusherServer.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="RestSharp, Version=105.2.3.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\RestSharp.105.2.3\lib\net45\RestSharp.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="StructureMap, Version=3.1.6.186, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\structuremap.3.1.6.186\lib\net40\StructureMap.dll</HintPath> + </Reference> + <Reference Include="StructureMap.Net4, Version=3.1.6.186, Culture=neutral, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>packages\structuremap.3.1.6.186\lib\net40\StructureMap.Net4.dll</HintPath> + </Reference> + <Reference Include="Swashbuckle.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=cd1bb07a5ac7c7bc, processorArchitecture=MSIL"> + <HintPath>packages\Swashbuckle.Core.5.3.2\lib\net40\Swashbuckle.Core.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Data" /> + <Reference Include="System.Drawing" /> + <Reference Include="System.Net" /> + <Reference Include="System.Net.Http" /> + <Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Net.Http.Formatting, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Net.Http.Primitives, Version=4.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Net.Http.WebRequest" /> + <Reference Include="System.Runtime.Caching" /> + <Reference Include="System.ServiceModel" /> + <Reference Include="System.Web.Extensions" /> + <Reference Include="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Http.Owin, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Http.WebHost, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="System.Xml" /> + <Reference Include="System.Xml.Linq" /> + <Reference Include="System" /> + <Reference Include="System.ComponentModel.DataAnnotations" /> + <Reference Include="System.Core" /> + <Reference Include="System.Web" /> + <Reference Include="System.Web.Abstractions" /> + <Reference Include="System.Web.Routing" /> + <Reference Include="System.Configuration" /> + <Reference Include="System.Web.Services" /> + <Reference Include="WebActivator, Version=1.5.3.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\WebActivator.1.5.3\lib\net40\WebActivator.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="WebActivatorEx, Version=2.0.0.0, Culture=neutral, PublicKeyToken=7b26dc2a43f6a0d4, processorArchitecture=MSIL"> + <HintPath>packages\WebActivatorEx.2.0\lib\net40\WebActivatorEx.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="WebApi.OutputCache.Core, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Strathweb.CacheOutput.WebApi2.0.9.0\lib\net45\WebApi.OutputCache.Core.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="WebApi.OutputCache.V2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> + <HintPath>packages\Strathweb.CacheOutput.WebApi2.0.9.0\lib\net45\WebApi.OutputCache.V2.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="WebGrease, Version=1.6.5135.21930, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> + <HintPath>packages\WebGrease.1.6.0\lib\WebGrease.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="YamlDotNet, Version=2.0.1.20271, Culture=neutral, PublicKeyToken=2b53052c5884d7a1, processorArchitecture=MSIL"> + <HintPath>packages\YamlDotNet.3.1.1\lib\net35\YamlDotNet.dll</HintPath> + <Private>True</Private> + </Reference> + <Reference Include="Zlib.Portable, Version=1.11.0.0, Culture=neutral, PublicKeyToken=431cba815f6a8b5b, processorArchitecture=MSIL"> + <HintPath>packages\Zlib.Portable.Signed.1.11.0\lib\portable-net4+sl5+wp8+win8+wpa81+MonoTouch+MonoAndroid\Zlib.Portable.dll</HintPath> + <Private>True</Private> + </Reference> + </ItemGroup> + <ItemGroup> + <Reference Include="Owin"> + <HintPath>packages\Owin.1.0\lib\net40\Owin.dll</HintPath> + </Reference> + </ItemGroup> + <ItemGroup> + <Compile Include="App_Start\StartupMigration.cs" /> + <Compile Include="App_Start\SwaggerConfig.cs" /> + <Compile Include="App_Start\WebApiConfig.cs" /> + <Compile Include="Controllers\Api\ActivitiesController.cs" /> + <Compile Include="Controllers\Api\ActivityTemplatesController.cs" /> + <Compile Include="Controllers\Api\DocumentationController.cs" /> + <Compile Include="Controllers\Api\LockedHttpActionResult.cs" /> + <Compile Include="Controllers\Api\OrganizationsController.cs" /> + <Compile Include="Controllers\Api\Fr8BaseApiController.cs" /> + <Compile Include="Controllers\Api\NotificationsController.cs" /> + <Compile Include="Controllers\Api\AlarmsController.cs" /> + <Compile Include="Controllers\Api\AuthenticationController.cs" /> + <Compile Include="Controllers\Api\ConfigurationController.cs" /> + <Compile Include="Controllers\Api\ManifestRegistryController.cs" /> + <Compile Include="Controllers\Api\ManifestsController.cs" /> + <Compile Include="Controllers\Api\PageDefinitionsController.cs" /> + <Compile Include="Controllers\Api\PageGenerationController.cs" /> + <Compile Include="Controllers\Api\PlanTemplatesController.cs" /> + <Compile Include="Controllers\Api\SubPlansController.cs" /> + <Compile Include="Controllers\Api\PlansController.cs" /> + <Compile Include="Controllers\Api\TerminalsController.cs" /> + <Compile Include="Controllers\Api\WarehousesController.cs" /> + <Compile Include="Controllers\CompanyController.cs" /> + <Compile Include="Controllers\PlanDirectoryController.cs" /> + <Compile Include="Controllers\RedirectController.cs" /> + <Compile Include="Controllers\ServicesController.cs" /> + <Compile Include="Controllers\SupportController.cs" /> + <Compile Include="Controllers\WelcomeController.cs" /> + <Compile Include="Controllers\Api\PlanNodesController.cs" /> + <Compile Include="Controllers\AuthenticationCallbackController.cs" /> + <Compile Include="Controllers\Api\FilesController.cs" /> + <Compile Include="Controllers\JsTestsController.cs" /> + <Compile Include="Controllers\Api\EventsController.cs" /> + <Compile Include="Controllers\EnvelopeController.cs" /> + <Compile Include="Controllers\Api\ContainerController.cs" /> + <Compile Include="Controllers\StatusController.cs" /> + <Compile Include="Controllers\AngularTemplateController.cs" /> + <Compile Include="Controllers\Api\UsersController.cs" /> + <Compile Include="Controllers\Api\WebServicesController.cs" /> + <Compile Include="DependencyResolution\IoC.cs" /> + <Compile Include="DependencyResolution\StructureMapDependencyResolver.cs" /> + <Compile Include="DependencyResolution\StructureMapDependencyScope.cs" /> +<<<<<<< HEAD + <Compile Include="Documentation\Swagger\DocumentFilters\AddDefaultValuesDocumentFilter.cs" /> + <Compile Include="Documentation\Swagger\DocumentFilters\RemoveDuplicatesDocumentFilter.cs" /> + <Compile Include="Documentation\Swagger\OperationFilters\RemoveParameterModelNameOperationFilter.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ActivitySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ActivityTemplateSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ActivityTemplateSummarySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenGrantSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\AuthenticationTokenTerminalSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\AuthorizationTokenSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ContainerSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\CrateDescriptionSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\CrateSampeFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\CrateStorageSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\CredentialsSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\DocumentationResponseSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FactSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FieldSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FileDOSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FileSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FilterConditionSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FullSubplanSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\HistoryResultSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\IncidentSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\IncomingCratesSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ISwaggerSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ManifestDescriptionSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\OrganizationSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PageDefinitionSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PayloadSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PhoneNumberCredentialsSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PhoneNumberVerificationSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanEmptySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanPostParamsSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanQuerySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanResultSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PollingDataSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ProfileSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\QuerySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\ResponseMessageSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\SubplanSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\TerminalNotificationSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\TerminalSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\TerminalSummarySampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\TokenResponseSampleFactory.cs" /> +======= + <Compile Include="Documentation\Swagger\DocumentFilters\AddHubDefaultValuesDocumentFilter.cs" /> + <Compile Include="Documentation\Swagger\SampleData\FileDOSampleFactory.cs" /> + <Compile Include="Documentation\Swagger\SampleData\PlanPostParamsSampleFactory.cs" /> +>>>>>>> Moved swagger sample factories into Fr8Infrastructure.NET in order to make them available for terminals too + <Compile Include="Documentation\Swagger\SampleData\TokenWrapperSampleFactory.cs" /> + <Compile Include="ExceptionHandling\ExeceptionHandler.cs" /> + <Compile Include="ExceptionHandling\Fr8ExceptionHandler.ErrorResult.cs" /> + <Compile Include="ExceptionHandling\Fr8ExceptionHandler.cs" /> + <Compile Include="App_Start\AutoMapperBootstrapper.cs" /> + <Compile Include="App_Start\BundleConfig.cs" /> + <Compile Include="App_Start\FilterConfig.cs" /> + <Compile Include="App_Start\RouteConfig.cs" /> + <Compile Include="Controllers\DockyardAccountController.cs" /> + <Compile Include="Controllers\AdminController.cs" /> + <Compile Include="Controllers\DashboardController.cs" /> + <Compile Include="Controllers\DataController.cs" /> + <Compile Include="Controllers\ControllerExtensions.cs" /> + <Compile Include="Controllers\Helpers\DemoExtensions.cs" /> + <Compile Include="Controllers\HomeController.cs" /> + <Compile Include="Controllers\Api\ReportsController.cs" /> + <Compile Include="Controllers\TokenAuthController.cs" /> + <Compile Include="Infrastructure_HubWeb\AngularTemplateCacheAttribute.cs" /> + <Compile Include="Infrastructure_HubWeb\FileActionResult.cs" /> + <Compile Include="Infrastructure_HubWeb\Fr8PlanDirectoryAuthenticationAttribute.cs" /> + <Compile Include="Infrastructure_HubWeb\Fr8TerminalAuthenticationAttribute.cs" /> + <Compile Include="Infrastructure_HubWeb\Fr8Identity.cs" /> + <Compile Include="Infrastructure_HubWeb\HtmlHelpers.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\AuthTokenManager.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\HubAuthenticationPDHeaderSignature.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryAuthorizeAttribute.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryHMACAuthenticateAttribute.cs" /> + <Compile Include="Infrastructure_PD\Infrastructure\PlanDirectoryHubCommunicatorFactory.cs" /> + <Compile Include="Infrastructure_PD\Interfaces\IAuthTokenManager.cs" /> + <Compile Include="Infrastructure_PD\Interfaces\IHubCommunicatorFactory.cs" /> + <Compile Include="SelfHostFactory.cs" /> + <Compile Include="ViewModels\AuthenticationErrorVM.cs" /> + <Compile Include="ViewModels\ForgotPasswordVM.cs" /> + <Compile Include="ViewModels\HomeVM.cs" /> + <Compile Include="ViewModels\EventVM.cs" /> + <Compile Include="Filters\RequestParamsEncryptedFilter.cs" /> + <Compile Include="Global.asax.cs"> + <DependentUpon>Global.asax</DependentUpon> + </Compile> + <Compile Include="Properties\AssemblyInfo.cs" /> + <Compile Include="Startup.cs" /> + <Compile Include="ViewModels\ExternalLoginConfirmationVM.cs" /> + <Compile Include="ViewModels\LoginVM.cs" /> + <Compile Include="ViewModels\ManageUserVM.cs" /> + <Compile Include="ViewModels\NavLinks.cs" /> + <Compile Include="ViewModels\RegisterVM.cs" /> + <Compile Include="ViewModels\RequestParameters\PlansGetParams.cs" /> + <Compile Include="ViewModels\RequestParameters\PlansPostParams.cs" /> + <Compile Include="ViewModels\ResetPasswordVM.cs" /> + <Compile Include="ViewModels\UserProfilesVM.cs" /> + <Compile Include="ViewModels\UserVM.cs" /> + <Compile Include="ExceptionHandling\WebApiExceptionFilterAttribute.cs" /> + </ItemGroup> + <ItemGroup> + <Content Include="Content\css\CDNRelatedStyles.css" /> + <Content Include="Content\css\dockyard\activity-stream.css" /> + <Content Include="Content\css\dockyard\authentication-dialog.css" /> + <Content Include="Content\css\dockyard\collapse.css" /> + <Content Include="Content\css\dockyard\container-transition.css" /> + <Content Include="Content\css\dockyard\query-builder.css" /> + <Content Include="Content\css\fonts\brankic.svg" /> + <Content Include="Content\css\fonts\fontawesome-webfont.svg" /> + <Content Include="Content\css\frontcss\main_new.css" /> + <Content Include="Content\css\homecss\bootstrap.css" /> + <Content Include="Content\css\homecss\font-awesome.min.css" /> + <Content Include="Content\css\homecss\ie.css" /> + <Content Include="Content\css\homecss\main.css" /> + <Content Include="Content\css\plan-category.css" /> + <Content Include="Content\css\plan-directory.css" /> + <Content Include="Content\css\shared\main.css" /> + <Content Include="Content\css\shared\navbar.css" /> + <Content Include="Content\css\shared\PlanDirectoryMain.css" /> + <Content Include="Content\icons\forward-icon-64x64.png" /> + <Content Include="Content\icons\get-icon-64x64.png" /> + <Content Include="Content\icons\monitor-icon-64x64.png" /> + <Content Include="Content\icons\process-icon-64x64.png" /> + <Content Include="Content\icons\web_services\asana-icon-64x64.png" /> + <Content Include="Content\icons\web_services\basecamp2-icon-64x64.png" /> + <Content Include="Content\icons\web_services\Box-logo_64x64.png" /> + <Content Include="Content\icons\web_services\fr8-demo-icon-64x64.png" /> + <Content Include="Content\icons\web_services\facebook-icon-64x64.png" /> + <Content Include="Content\icons\web_services\gmail-icon-64x64.png" /> + <Content Include="Content\icons\web_services\instagram-icon-64x64.png" /> + <Content Include="Content\icons\web_services\statX-icon-64x64.png" /> + <Content Include="Content\icons\web_services\twitter-icon-64x64.png" /> + <Content Include="Content\icons\web_services\telegram-icon-64x64.png" /> + <Content Include="Content\img\background-7.png" /> + <Content Include="Content\img\background-cta-3.jpg" /> + <Content Include="Content\img\background-cta-3.png" /> + <Content Include="Content\img\dockyard_logo_dark.png" /> + <Content Include="Content\img\dockyard_logo_lower.png" /> + <Content Include="Content\img\dockyard_logo_white.png" /> + <Content Include="Content\img\docusign-logo.png" /> + <Content Include="Content\img\docusign.png" /> + <Content Include="Content\img\fr8-service.png" /> + <Content Include="Content\img\freight-connect.jpg" /> + <Content Include="Content\img\freight-connect.png" /> + <Content Include="Content\img\freight-containers.jpg" /> + <Content Include="Content\img\freight-containers_s.jpg" /> + <Content Include="Content\img\freight-design.jpg" /> + <Content Include="Content\img\freight-design.png" /> + <Content Include="Content\img\freight-train.jpg" /> + <Content Include="Content\img\freight-train.png" /> + <Content Include="Content\img\google.png" /> + <Content Include="Content\img\gray-crate.png" /> + <Content Include="Content\img\green-crate.png" /> + <Content Include="Content\img\backgrounds\solution-bg.png" /> + <Content Include="Content\img\icons\more_vert.svg" /> + <Content Include="Content\img\logo-fr8.svg" /> + <Content Include="Content\img\logo.svg" /> + <Content Include="Content\img\Management\Alexei_Avrutin.png" /> + <Content Include="Content\img\Management\Alex_Edelstein_Round.png" /> + <Content Include="Content\img\Management\Andrew_Cantino.png" /> + <Content Include="Content\img\Management\Bahadir_Bozdag.png" /> + <Content Include="Content\img\Management\Benjamin_Black.png" /> + <Content Include="Content\css\additionalcss\bootstrap23\css\bootstrap2.3.css" /> + <Content Include="Content\css\additionalcss\bootstrap23\img\glyphicons-halflings-white.png" /> + <Content Include="Content\css\additionalcss\bootstrap23\img\glyphicons-halflings.png" /> + <Content Include="Content\css\additionalcss\bootstrap30\css\bootstrap-datetimepicker.css" /> + <Content Include="Content\css\additionalcss\bootstrap30\css\bootstrap-responsive.css" /> + <Content Include="Content\css\additionalcss\bootstrap30\css\bootstrap3.0.css" /> + <Content Include="Content\css\additionalcss\bootstrap30\fonts\glyphicons-halflings-regular.svg" /> + <Content Include="Content\css\additionalcss\colorbox\colorbox.css" /> + <Content Include="Content\css\additionalcss\colorbox\img\controls.png" /> + <Content Include="Content\css\additionalcss\colorbox\img\loading.gif" /> + <Content Include="Content\css\additionalcss\font-awesome\css\font-awesome.css" /> + <Content Include="Content\css\additionalcss\font-awesome\css\style.css" /> + <Content Include="Content\css\additionalcss\font-awesome\fonts\fontawesome-webfont.svg" /> + <Content Include="Content\css\additionalcss\select2\select2-spinner.gif" /> + <Content Include="Content\css\additionalcss\select2\select2.css" /> + <Content Include="Content\css\additionalcss\select2\select2.png" /> + <Content Include="Content\css\additionalcss\select2\select2x2.png" /> + <Content Include="Content\css\backendcss\default.css" /> + <Content Include="Content\css\dockyard.css" /> + <Content Include="Content\css\EmailSend.css" /> + <Content Include="Content\css\frontcss\main.css" /> + <Content Include="Content\css\jackedup.css" /> + <Content Include="Content\css\jqtree.css" /> + <Content Include="Content\css\jquery-ui.css" /> + <Content Include="Content\css\jquery-ui.structure.css" /> + <Content Include="Content\css\jquery-ui.theme.css" /> + <Content Include="Content\css\NegotiationWidgets.css" /> + <Content Include="Content\css\toolbar.min.css" /> + <Content Include="Content\css\welcome.css" /> + <Content Include="Content\DO-823.sql" /> + <Content Include="Content\documents\Medical_Form_v2.xml" /> + <Content Include="Content\fonts\glyphicons-halflings-regular.svg" /> + <Content Include="Content\icons\web_services\aws-icon-64x64.png" /> + <Content Include="Content\icons\web_services\docusign-icon-64x64.png" /> + <Content Include="Content\icons\web_services\DocuSign-Logo.png" /> + <Content Include="Content\icons\web_services\dropbox-icon-64x64.png" /> + <Content Include="Content\icons\web_services\fr8-core-icon-64x64.png" /> + <Content Include="Content\icons\web_services\google-icon-64x64.png" /> + <Content Include="Content\icons\web_services\jira-icon-64x64.png" /> + <Content Include="Content\icons\web_services\ms-azure-icon-64x64.png" /> + <Content Include="Content\icons\web_services\ms-excel-icon-64x64.png" /> + <Content Include="Content\icons\web_services\papertrail-icon-64x64.png" /> + <Content Include="Content\icons\web_services\quickbooks-icon-64x64.png" /> + <Content Include="Content\icons\web_services\salesforce-icon-64x64.png" /> + <Content Include="Content\icons\web_services\sendgrid-icon-64x64.png" /> + <Content Include="Content\icons\web_services\slack-icon-64x64.png" /> + <Content Include="Content\icons\web_services\twilio-icon-64x64.png" /> + <Content Include="Content\icons\web_services\unknown-service.png" /> + <Content Include="Content\icons\web_services\yammer-64x64.png" /> + <Content Include="Content\img\ajax-loader.gif" /> + <Content Include="Content\img\backgrounds\about-bg.jpg" /> + <Content Include="Content\img\backgrounds\bg-overlay.png" /> + <Content Include="Content\img\backgrounds\contact-bg.jpg" /> + <Content Include="Content\img\backgrounds\cup-and-coffe-bg.png" /> + <Content Include="Content\img\backgrounds\dockyard_main1600.jpg" /> + <Content Include="Content\img\backgrounds\ie-black-bg.png" /> + <Content Include="Content\img\backgrounds\login-wrapper-bg.png" /> + <Content Include="Content\img\backgrounds\services-bg.jpg" /> + <Content Include="Content\img\backgrounds\welocome-bg.jpg" /> + <Content Include="Content\img\backgrounds\white-bg-overlay.png" /> + <Content Include="Content\img\Cross.png" /> + <Content Include="Content\img\dockyard_logo.png" /> + <Content Include="Content\img\EmailLogo.png" /> + <Content Include="Content\img\exclamation-small.png" /> + <Content Include="Content\img\favicon.ico" /> + <Content Include="Content\img\googleCalendar.png" /> + <Content Include="Content\img\icloud-logo.png" /> + <Content Include="Content\img\icons\facebook.png" /> + <Content Include="Content\img\icons\googleplus.png" /> + <Content Include="Content\img\icons\linkedin.png" /> + <Content Include="Content\img\icons\next-page-bnt.png" /> + <Content Include="Content\img\icons\rss.png" /> + <Content Include="Content\img\icons\sort_asc.png" /> + <Content Include="Content\img\icons\sort_asc_disabled.png" /> + <Content Include="Content\img\icons\sort_both.png" /> + <Content Include="Content\img\icons\sort_desc.png" /> + <Content Include="Content\img\icons\sort_desc_disabled.png" /> + <Content Include="Content\img\icons\twitter.png" /> + <Content Include="Content\img\icons\vimeo.png" /> + <Content Include="Content\img\icons\youtube.png" /> + <Content Include="Content\img\Management\Alex_Edelstein.png" /> + <Content Include="Content\img\Management\placeholder_headshot.png" /> + <Content Include="Content\img\Management\Stuart_Gold.png" /> + <Content Include="Content\img\MicrosoftExchangelogo.png" /> + <Content Include="Content\img\minus.png" /> + <Content Include="Content\img\plan-bg.jpg" /> + <Content Include="Content\img\plus.png" /> + <Content Include="Content\img\PlanBuilder\action-add-small.png" /> + <Content Include="Content\img\PlanBuilder\actions-node-bg.png" /> + <Content Include="Content\img\PlanBuilder\actions-node-bottom.png" /> + <Content Include="Content\img\PlanBuilder\actions-node-top.png" /> + <Content Include="Content\img\PlanBuilder\add-criteria-node-bg.png" /> + <Content Include="Content\img\PlanBuilder\circle-selected.png" /> + <Content Include="Content\img\PlanBuilder\circle.png" /> + <Content Include="Content\img\PlanBuilder\criteria-node-bg.png" /> + <Content Include="Content\img\PlanBuilder\delete-icon.png" /> + <Content Include="Content\img\PlanBuilder\right-arrow.png" /> + <Content Include="Content\img\PlanBuilder\start-node-bg.png" /> + <Content Include="Content\img\salesforce.png" /> + <Content Include="Content\img\select-info.png" /> + <Content Include="Content\img\site\alex-photo.png" /> + <Content Include="Content\img\site\arrow_blue_gray_ic_arrow_forward_48px-512.png" /> + <Content Include="Content\img\site\arrow_blue_ic_arrow_forward_48px-512.png" /> + <Content Include="Content\img\site\arrow_deep_blue_ic_arrow_forward_48px-512.png" /> + <Content Include="Content\img\site\arrow_red_ic_arrow_forward_48px-512.png" /> + <Content Include="Content\img\site\arrow_yellow_ic_arrow_forward_48px-512.png" /> + <Content Include="Content\img\site\browser-header.jpg" /> + <Content Include="Content\img\site\docusign-dashboard-example.png" /> + <Content Include="Content\img\site\docusign-workflow-example-1.png" /> + <Content Include="Content\img\site\docusign-workflow-example-2.png" /> + <Content Include="Content\img\site\docusign-workflow-example-3.png" /> + <Content Include="Content\img\site\email-header.png" /> + <Content Include="Content\img\site\How_it_works_diagram.png" /> + <Content Include="Content\img\site\kwasant-video-screen-logo.png" /> + <Content Include="Content\img\site\kwasant-video-screen.png" /> + <Content Include="Content\img\site\site-logo.png" /> + <Content Include="Content\img\welcome\docusign.png" /> + <Content Include="Content\img\welcome\fr8Terminals-howitworks.png" /> + <Content Include="Content\img\welcome\left-side-bg.jpg" /> + <Content Include="Content\img\welcome\logo.png" /> + <Content Include="Content\img\welcome\plan_builder.png" /> + <Content Include="Content\img\welcome\plan_with_activities.png" /> + <Content Include="Content\img\welcome\right-pane-bg.png" /> + <Content Include="Content\img\welcome\right-side-bg.jpg" /> + <Content Include="Content\img\welcome\routeBuilder.png" /> + <Content Include="Content\img\welcome\DocuSign_Logo_Purple_Yellow.png" /> + <Content Include="Content\img\welcome\header_green.png" /> + <Content Include="Content\img\welcome\welcome_header.png" /> + <Content Include="Content\img\white-bg-overlay.png" /> + <Content Include="Content\metronic\components.css" /> + <Content Include="Content\metronic\jquery.blockui.min.js" /> + <Content Include="Content\metronic\loading.gif" /> + <Content Include="Content\metronic\ui.js" /> + <Content Include="Content\videos\motion.mp4" /> + <Content Include="Content\videos\motion.png" /> + <Content Include="Content\videos\motion_1920.jpg" /> + <Content Include="Content\videos\motion_1920.mp4" /> + <Content Include="Content\img\Management\Rob_Bailey.png" /> + <Content Include="Scripts\ai.0.15.0-build58334.js" /> + <Content Include="Scripts\ai.0.15.0-build58334.min.js" /> + <Content Include="Scripts\homejs\bootstrap.min.js" /> + <Content Include="Scripts\homejs\html5shiv.js" /> + <Content Include="Scripts\homejs\jquery-2.1.0.min.js" /> + <Content Include="Scripts\homejs\loop.js" /> + <Content Include="Scripts\homejs\plugins\easing\jquery.easing.min.js" /> + <Content Include="Scripts\homejs\plugins\easypiechart\jquery.easypiechart.min.js" /> + <Content Include="Scripts\homejs\plugins\flexslider\jquery.flexslider-min.js" /> + <Content Include="Scripts\homejs\plugins\isotope\imagesloaded.pkgd.js" /> + <Content Include="Scripts\homejs\plugins\isotope\isotope.pkgd.min.js" /> + <Content Include="Scripts\homejs\plugins\jpreloader\jpreloader.min.js" /> + <Content Include="Scripts\homejs\plugins\magnific\jquery.magnific-popup.min.js" /> + <Content Include="Scripts\homejs\plugins\parallax\jquery.parallax-1.1.3.js" /> + <Content Include="Scripts\homejs\plugins\parsley\parsley.min.js" /> + <Content Include="Scripts\homejs\plugins\scrollto\jquery.localscroll-1.2.7-min.js" /> + <Content Include="Scripts\homejs\plugins\scrollto\jquery.scrollTo-1.4.3.1-min.js" /> + <Content Include="Scripts\homejs\plugins\twitter\twitter-fetcher.js" /> + <Content Include="Scripts\homejs\plugins\vide\jquery.vide.min.js" /> + <Content Include="Scripts\homejs\plugins\waypoints\waypoints.min.js" /> + <Content Include="Scripts\homejs\plugins\wow\wow.js" /> + <Content Include="Scripts\PlanBuilder\core.js" /> + <Content Include="Scripts\PlanBuilder\pb-consts.js" /> + <Content Include="Scripts\PlanBuilder\pb-fabricjs-img.js" /> + <Content Include="Scripts\PlanBuilder\pb-fabricjs.js" /> + <Content Include="Scripts\PlanBuilder\pb-interfaces.js" /> + <Content Include="Scripts\PlanBuilder\pb-resources.js" /> + <Content Include="Scripts\PlanBuilder\pb-widget.js" /> + <Content Include="Scripts\PlanDirectoryApp.js" /> + <Content Include="Scripts\PlanDirectoryMain.js" /> + <Content Include="Scripts\templateCache.js" /> + <Content Include="Scripts\tests\e2e\authorizationPathways\google.spec.js" /> + <Content Include="Scripts\tests\e2e\conf.js" /> + <Content Include="Scripts\tests\e2e\login\login.spec.js" /> + <Content Include="Scripts\tests\e2e\pages\myAccount.page.js" /> + <Content Include="Scripts\tests\e2e\pages\plans.page.js" /> + <Content Include="Scripts\tests\e2e\registration\registration.spec.js" /> + <Content Include="Scripts\tests\e2e\pages\login.page.js" /> + <Content Include="Scripts\tests\e2e\pages\registration.page.js" /> + <Content Include="Scripts\tests\e2e\shared\accountHelper.js" /> + <Content Include="Scripts\tests\e2e\shared\consoleLog.js" /> + <Content Include="Scripts\tests\e2e\shared\manageAuthTokens.js" /> + <Content Include="Scripts\tests\e2e\shared\uiHelpers.js" /> + <Content Include="Views\AngularTemplate\DatePicker.cshtml" /> + <Content Include="ApplicationInsights.config"> + <TransformOnBuild>true</TransformOnBuild> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <None Include="ApplicationInsights.alexlocal.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + </None> + <None Include="ApplicationInsights.Debug.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="ApplicationInsights.Demo.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + </None> + <None Include="ApplicationInsights.Dev.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="ApplicationInsights.fr8dev - FTP.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + </None> + <None Include="ApplicationInsights.fr8dev - Web Deploy.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + </None> + <None Include="ApplicationInsights.Release.config"> + <DependentUpon>ApplicationInsights.config</DependentUpon> + <IsTransformFile>True</IsTransformFile> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <Content Include="Content\css\fonts\brankic.eot" /> + <Content Include="Content\css\fonts\brankic.ttf" /> + <Content Include="Content\css\fonts\brankic.woff" /> + <Content Include="Content\css\fonts\fontawesome-webfont.eot" /> + <Content Include="Content\css\fonts\fontawesome-webfont.ttf" /> + <Content Include="Content\css\fonts\fontawesome-webfont.woff" /> + <Content Include="Content\css\fonts\fontawesome-webfont.woff2" /> + <Content Include="Content\videos\motion.ogv" /> + <Content Include="Content\videos\motion.webm" /> + <Content Include="Views\AngularTemplate\ContainerTransition.cshtml" /> + <Content Include="Views\AngularTemplate\SubplanHeader.cshtml" /> + <Content Include="Views\AngularTemplate\MetaControlContainer.cshtml" /> + <Content Include="Views\AngularTemplate\Fr8Event.cshtml" /> + <Content Include="Views\AngularTemplate\ControlList.cshtml" /> + <Content Include="Views\AngularTemplate\Empty.cshtml" /> + <Content Include="Views\AngularTemplate\SelectActivityDialog.cshtml" /> + <Content Include="Views\AngularTemplate\ConfigureActivityDialog.cshtml" /> + <Content Include="Views\AngularTemplate\MainContainer_AS.cshtml" /> + <Content Include="Views\AngularTemplate\MainContainer.cshtml" /> + <Content Include="Views\AngularTemplate\ExternalObjectChooser.cshtml" /> + <Content Include="Config\log4net.config" /> + <Content Include="Config\log4net.Demo.config" /> + <Content Include="Config\log4net.Dev.config" /> + <Content Include="Config\log4net.Release.config" /> + <Content Include="Config\log4net.terminals.config" /> + <Content Include="Config\log4net.terminals.Demo.config" /> + <Content Include="Config\log4net.terminals.Dev.config" /> + <Content Include="Config\log4net.terminals.Release.config" /> + <Content Include="Config\log4net.tests.config" /> + <Content Include="Config\log4net.tests.healthMonitor.config" /> + <Content Include="Config\log4net.tests.healthMonitor.Demo.config" /> + <Content Include="Config\log4net.tests.healthMonitor.Dev.config" /> + <Content Include="Config\log4net.tests.healthMonitor.Release.config" /> + <Content Include="Views\AngularTemplate\FilterPane.cshtml" /> + <Content Include="Views\AngularTemplate\MiniHeader.cshtml" /> + <Content Include="Views\AngularTemplate\ActivityLabelModal.cshtml" /> + <Content Include="Views\AngularTemplate\AdvisoryMessagesPopup.cshtml" /> + <Content Include="Views\AngularTemplate\PhoneNumberAuthentication.cshtml" /> + <Content Include="Views\AngularTemplate\ActionPickerPanel.cshtml" /> + <Content Include="Views\AngularTemplate\HeaderNav.cshtml" /> + <Content Include="Config\HubWeb\Settings.config.readme" /> + <Content Include="LICENSE" /> + <None Include="Views\AngularTemplate\Messages.cshtml" /> + <Content Include="Scripts\dummyTemplates.js" /> + <Content Include="_PowerShellScripts\Combine-Sources.ps1" /> + <Content Include="_PowerShellScripts\HM-job-run.cmd" /> + <Content Include="_PowerShellScripts\HM-job-settings.job" /> + <Content Include="_PowerShellScripts\Deploy-HMAsWebJob.ps1" /> + <Content Include="_PowerShellScripts\SetCloudServiceSize.ps1" /> + <Content Include="_PowerShellScripts\CloneDatabase.ps1" /> + <Content Include="_PowerShellScripts\DeleteDatabase.ps1" /> + <Content Include="_PowerShellScripts\Set-EndpointsStaging.ps1" /> + <Content Include="_PowerShellScripts\CopyAppInsightsConfigs.ps1" /> + <Content Include="_PowerShellScripts\Set-CS.ps1" /> + <Content Include="_PowerShellScripts\Wait-Database.ps1" /> + <Content Include="_PowerShellScripts\Run-IntegrationTests.ps1" /> + <Content Include="_PowerShellScripts\Upload-File.ps1" /> + <Content Include="_PowerShellScripts\Start-StagingWebsite.ps1" /> + <Content Include="_PowerShellScripts\Stop-StagingWebsite.ps1" /> + <Content Include="_PowerShellScripts\Start-Sleep.ps1" /> + <Content Include="_PowerShellScripts\Update-HostnameInTerminals.ps1" /> + <Content Include="_PowerShellScripts\Add-BuildServer.ps1" /> + <Content Include="_PowerShellScripts\Set-EndpointsDev.ps1" /> + <Content Include="_PowerShellScripts\Check-Confirmation.ps1" /> + <Content Include="_PowerShellScripts\MergePRSourcesIntoDev.ps1" /> + <Content Include="_PowerShellScripts\Run-ProtractorTests.ps1" /> + <Content Include="_PowerShellScripts\Set-GitHubBuildStatus.ps1" /> + <Content Include="_PowerShellScripts\DeleteHostedDatabase.ps1" /> + <Content Include="_PowerShellScripts\RestoreDatabaseFromBackup.ps1" /> + <Content Include="_PowerShellScripts\CleanUpAfterTests.ps1" /> + <Content Include="_PowerShellScripts\Copy-ImagesBetweenAccount.ps1" /> + <Content Include="Views\JsTests\endpoints.cshtml" /> + <Content Include="Views\AngularTemplate\PlanUploadModal.cshtml" /> + <Content Include="_PowerShellScripts\Set-Config.ps1" /> + <Content Include="Views\Redirect\ClonePlan.cshtml" /> + <Content Include="Views\AngularTemplate\UpstreamFieldChooser.cshtml" /> + <Content Include="_PowerShellScripts\Set-WebsiteAppSettings.ps1" /> + <Content Include="_PowerShellScripts\Create-SDKNuget.ps1" /> + <Content Include="Views\AngularTemplate\PageDefinitionList.cshtml" /> + <Content Include="_PowerShellScripts\Reboot-CloudService.ps1" /> + <Content Include="_PowerShellScripts\Remove-HMAsWebJob.ps1" /> + <Content Include="_PowerShellScripts\Create-VersionFile.ps1" /> + <Content Include="_PowerShellScripts\Set-CsConfig.ps1" /> + <Content Include="_PowerShellScripts\ClearDbBeforeTests.ps1" /> + <Content Include="_PowerShellScripts\Run-DBMigration.ps1" /> + <Content Include="Views\Shared\CDN\_AngularAppScripts.cshtml" /> + <Content Include="Views\AngularTemplate\PlanBuilder_SimpleKioskMode.cshtml" /> + <Content Include="Views\AngularTemplate\ActivityHeader.cshtml" /> + <Content Include="_PowerShellScripts\Run-SQL.ps1" /> + <Content Include="_PowerShellScripts\Set-AzureSQLService.ps1" /> + <Content Include="_PowerShellScripts\Add-Repo.ps1" /> + <Content Include="Views\AngularTemplate\PermissionsSetterModal.cshtml" /> + <Content Include="Views\AngularTemplate\TerminalDetail.cshtml" /> + <Content Include="Views\AngularTemplate\TerminalPublishForm.cshtml" /> + <Content Include="Views\PlanDirectory\Index.cshtml" /> + <Content Include="_PowerShellScripts\Set-Endpoints.ps1" /> + <None Include="_PowerShellScripts\Swap-CloudService.ps1" /> + <Content Include="_PowerShellScripts\Update-HostnameInTerminalRegistration.ps1" /> + <TypeScriptCompile Include="Scripts\app\controllers\FileDetailsController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\KioskModeOrganizationHeaderController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ManageUserController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ManifestRegistryFormController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ManifestRegistryListController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\OrganizationController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PhoneNumberAuthenticationController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanUploadModalController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanUploadController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PageDefinitionFormController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PageDefinitionListController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\SolutionDocumentationController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\TerminalDetailsController.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\UIBlocker.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\ActionPicker.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\BuildMessageAppender.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\ControlList.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\ExternalObjectChooser.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\FilterPane.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\MetaControlContainer.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\ContainerTransition.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\DatePicker.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\Fr8Event.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\QueryBuilder.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\QueryBuilderCondition.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\SelectData.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\SourceableCriteria.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\CrateChooser.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\UpstreamFieldChooser.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\TimePicker.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\UpstreamCrateChooser.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\UpstreamFieldChooserButton.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\ActivityResize.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\fillHeight.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\ModalResizable.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\ActivityHeader.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\SubplanHeader.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Validators\ManifestDescriptionValidators.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\ParticipationState.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\PermissionType.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\NotificationType.ts" /> + <TypeScriptCompile Include="Scripts\app\enums\UINotificationMessageStatus.ts" /> + <TypeScriptCompile Include="Scripts\app\events\Fr8Events.ts" /> + <TypeScriptCompile Include="Scripts\app\filters\DateTimeFormatter.ts" /> + <TypeScriptCompile Include="Scripts\app\filters\FilterByTag.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\AuthenticationDialogController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ManageAuthTokenController.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IPageDefinition.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IManifestRegistry.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IProfile.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ActivityResponseDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\AdvisoryMessages.ts" /> + <TypeScriptCompile Include="Scripts\app\model\AlertDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\PageDefinition.ts" /> + <TypeScriptCompile Include="Scripts\app\model\TerminalRegistrationDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ValidationResults.ts" /> + <TypeScriptCompile Include="Scripts\app\model\HistoryDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\IncomingCratesDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ManifestDescriptionDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\CrateDescriptionDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\OrganizationDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\Profile.ts" /> + <TypeScriptCompile Include="Scripts\app\model\SubordinateSubplan.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ActivityService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\AuthService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ConfigureTrackerService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\FileDetailsService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\FileService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ActivityTemplateService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\UINotificationService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\PageDefinitionService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ManifestRegistryService.ts" /> + <TypeScriptCompile Include="Scripts\app\model\DocumentationResponseDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ConfigureTrackerService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\FileDetailsService.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\ISolutionDocumentationService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\OrganizationService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\SolutionDocumentationService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\SubordinateSubplanService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\UpstreamExtractor.ts" /> + <TypeScriptCompile Include="Scripts\tests\endpoints\plansControllerRefactoring.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\ActionPicker.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\QueryBuilder.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\UpstreamFieldChooserButton.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\filters\FilterByTagTests.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\TerminalFormController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\TerminalListController.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IManageAuthToken.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\ITerminal.ts" /> + <TypeScriptCompile Include="Scripts\app\model\AuthenticationTokenDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\TerminalActionSetDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\TerminalDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ManageAuthTokenService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\TerminalService.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\PlanDetailsControllerTests.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\UpstreamDataChooser.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\UpstreamDataChooser.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\services\ManifestRegistryServiceTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\directives\controls\fixture_UpstreamDataChooser.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\directives\controls\fixture_UpstreamFieldChooser.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\jpattern.ts" /> + <TypeScriptCompile Include="Scripts\lib\jpattern.d.ts" /> + <Content Include="Views\AngularTemplate\AccountDetails.cshtml" /> + <Content Include="Views\AngularTemplate\AccountList.cshtml" /> + <Content Include="Views\AngularTemplate\ConfigurationControl.cshtml" /> + <Content Include="Views\AngularTemplate\ConfirmationModal.cshtml" /> + <Content Include="Views\AngularTemplate\ContainerDetails.cshtml" /> + <Content Include="Views\AngularTemplate\ContainerList.cshtml" /> + <Content Include="Views\AngularTemplate\DesignerHeader.cshtml" /> + <Content Include="Views\AngularTemplate\DropDownListBox.cshtml" /> + <Content Include="Views\AngularTemplate\FieldList.cshtml" /> + <Content Include="Views\AngularTemplate\FilePicker.cshtml" /> + <Content Include="Views\AngularTemplate\FileSelectorModal.cshtml" /> + <Content Include="Views\AngularTemplate\Footer.cshtml" /> + <Content Include="Views\AngularTemplate\Header.cshtml" /> + <Content Include="Views\AngularTemplate\InternalAuthentication.cshtml" /> + <Content Include="Views\AngularTemplate\ManageFileList.cshtml" /> + <Content Include="Views\AngularTemplate\MappingPane.cshtml" /> + <Content Include="Views\AngularTemplate\MyAccountPage.cshtml" /> + <Content Include="Views\AngularTemplate\PageHead.cshtml" /> + <Content Include="Views\AngularTemplate\PaneConfigureAction.cshtml" /> + <Content Include="Views\AngularTemplate\PaneSelectActionModal.cshtml" /> + <Content Include="Views\AngularTemplate\PlanBuilder.cshtml" /> + <Content Include="Views\AngularTemplate\RadioButtonOption.cshtml" /> + <Content Include="Views\AngularTemplate\PlanDetails.cshtml" /> + <Content Include="Views\AngularTemplate\PlanList.cshtml" /> + <Content Include="Views\AngularTemplate\ShowFacts.cshtml" /> + <Content Include="Views\AngularTemplate\ShowIncidents.cshtml" /> + <Content Include="Views\AngularTemplate\TextArea.cshtml" /> + <Content Include="Views\AngularTemplate\TextBlock.cshtml" /> + <Content Include="Views\AuthenticationCallback\ProcessSuccessfulOAuthResponse.cshtml" /> + <Content Include="_PowerShellScripts\RunFrontEndTests-VSO.ps1" /> + <Content Include="Views\DockyardAccount\_HeaderPartial.cshtml" /> + <Content Include="Content\fonts\glyphicons-halflings-regular.eot" /> + <Content Include="Content\fonts\glyphicons-halflings-regular.ttf" /> + <Content Include="Content\fonts\glyphicons-halflings-regular.woff" /> + <Content Include="Content\fonts\glyphicons-halflings-regular.woff2" /> + <None Include="Properties\PublishProfiles\dockyard - FTP.pubxml" /> + <None Include="Properties\PublishProfiles\dockyard - Web Deploy.pubxml" /> + <None Include="Properties\PublishProfiles\fr8 - FTP.pubxml" /> + <None Include="Properties\PublishProfiles\fr8 - Web Deploy.pubxml" /> + <Content Include="Views\Services\DocuSign.cshtml" /> + <Content Include="Views\Shared\_HomePage.cshtml" /> + <Content Include="_PowerShellScripts\CheckWebSettings.ps1" /> + <Content Include="Service References\Application Insights\ConnectedService.json" /> + <Content Include="Views\Welcome\Index.cshtml" /> + <Content Include="Views\AngularTemplate\RunPlanButton.cshtml" /> + <Content Include="Views\AngularTemplate\ManageAuthTokens.cshtml" /> + <None Include="Properties\PublishProfiles\fr8dev - FTP.pubxml" /> + <None Include="Properties\PublishProfiles\fr8dev - Web Deploy.pubxml" /> + <Content Include="Properties\SlowCheetah\SlowCheetah.Transforms.targets" /> + <Content Include="Views\AngularTemplate\TerminalForm.cshtml" /> + <Content Include="Views\AngularTemplate\TerminalList.cshtml" /> + <Content Include="Views\AngularTemplate\AuthenticationDialog.cshtml" /> + <Content Include="Views\AngularTemplate\UpstreamDataChooser.cshtml" /> + <Content Include="Views\AngularTemplate\UpstreamFieldChooserDialog.cshtml" /> + <Content Include="Views\AngularTemplate\UsersEmailList.cshtml" /> + <Content Include="Views\AngularTemplate\FileDetails.cshtml" /> + <Content Include="Views\AngularTemplate\ManifestRegistryList.cshtml" /> + <Content Include="Views\AngularTemplate\_Debug.cshtml" /> + <Content Include="Views\AngularTemplate\UpstreamCrateChooser.cshtml" /> + <Content Include="Views\AngularTemplate\ActionPicker.cshtml" /> + <Content Include="Views\Services\HowItWorks.cshtml" /> + <Content Include="Views\AngularTemplate\SolutionDocumentation.cshtml" /> + <Content Include="Views\Services\Salesforce.cshtml" /> + <Content Include="Views\Services\GoogleApps.cshtml" /> + <Content Include="Views\Support\Index.cshtml" /> + <Content Include="Views\AngularTemplate\ChangePassword.cshtml" /> + <Content Include="Views\Company\Index.cshtml" /> + <Content Include="Views\Shared\_AngularAppStyles.cshtml" /> + <Content Include="Views\Shared\CDN\_AngularAppStyles.cshtml" /> + <Content Include="Views\AngularTemplate\SourceableCriteria.cshtml" /> + <Content Include="Views\AngularTemplate\CrateChooser.cshtml" /> + <Content Include="Views\AngularTemplate\_PlanReportList.cshtml" /> + <Content Include="Views\AngularTemplate\PlanReportList.cshtml" /> + <Content Include="Views\AngularTemplate\TimePicker.cshtml" /> + <Content Include="Views\Shared\_HomeNavNew.cshtml" /> + <Content Include="Views\Shared\_HomePageNew.cshtml" /> + <Content Include="Views\AngularTemplate\PlanBuilder_KioskMode.cshtml" /> + <Content Include="Views\AngularTemplate\ActivityStream.cshtml" /> + <Content Include="Views\Shared\401.cshtml" /> + <Content Include="Views\Services\SolutionListTemplate.cshtml" /> + <Content Include="Views\AngularTemplate\SelectData.cshtml" /> + <Content Include="Views\AngularTemplate\BuildMessageAppender.cshtml" /> + <Content Include="Views\AngularTemplate\KioskModeOrganizationHeader.cshtml" /> + <Content Include="Views\AngularTemplate\Organization.cshtml" /> + <Content Include="Views\AngularTemplate\QueryBuilder.cshtml" /> + <Content Include="Views\AngularTemplate\QueryBuilderCondition.cshtml" /> + <Content Include="Views\AngularTemplate\ReportIncidentModal.cshtml" /> + <None Include="Web.Demo.config"> + <DependentUpon>Web.config</DependentUpon> + </None> + <None Include="Web.Dev.config"> + <DependentUpon>Web.config</DependentUpon> + </None> + <TypeScriptCompile Include="Scripts\app\controllers\InternalAuthenticationController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ManageFileListController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ContainerListController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ContainerDetailsController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\NotifierController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PayloadFormController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanActionsDialogController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\SelectActionController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanDetailsController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ReportFactController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\ReportIncidentController.ts" /> + <Content Include="Scripts\lib\jquery.blockui.min.js" /> + <Content Include="Views\Sandbox\Index.cshtml" /> + <TypeScriptCompile Include="Scripts\app\controllers\SandboxController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\WebServiceListController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\WebServiceFormController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\SolutionListController.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\Counter.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\Duration.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\ManagePlan.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\TextSource.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\DropDownListBox.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\FieldList.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\MappingPane.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\TextArea.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\TextBlock.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\AccountDetailsController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\AccountListController.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\RadioButtonGroup.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\Controls\FilePicker.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\DesignerHeader\DesignerHeader.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\layout.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\LongAjaxCursor.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneConfigureAction\ConfigurationControl.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneSelectAction\PaneSelectAction.ts" /> + <TypeScriptCompile Include="Scripts\app\filters\ActionNameFormatter.ts" /> + <TypeScriptCompile Include="Scripts\app\filters\ContainerState.ts" /> + <TypeScriptCompile Include="Scripts\app\filters\PlanState.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IContainer.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IManageFile.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IUser.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IWebService.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ActionGroup.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ActivityCategoryDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\CrateStorage.ts" /> + <TypeScriptCompile Include="Scripts\app\model\FactDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\FileDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\FileDescriptionDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ControlsList.ts" /> + <Content Include="Scripts\modernizr-2.7.2.js" /> + <TypeScriptCompile Include="Scripts\app\model\ActivityTemplate.ts" /> + <TypeScriptCompile Include="Scripts\app\model\FieldMappingSettings.ts" /> + <TypeScriptCompile Include="Scripts\app\model\IncidentDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\SubPlan.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ContainerDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\Plan.ts" /> + <TypeScriptCompile Include="Scripts\app\model\PlanBuilderState.ts" /> + <TypeScriptCompile Include="Scripts\app\model\User.ts" /> + <TypeScriptCompile Include="Scripts\app\model\WebServiceActionSetDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\WebServiceDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ContainerService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\CrateHelper.ts" /> + <TypeScriptCompile Include="Scripts\app\services\LayoutService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ManageFileService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\PusherNotifierService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\ReportService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\UIHelperService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\UserService.ts" /> + <TypeScriptCompile Include="Scripts\app\services\WebServiceService.ts" /> + <Content Include="Scripts\respond.js" /> + <Content Include="Scripts\respond.matchmedia.addListener.js" /> + <Content Include="Scripts\respond.matchmedia.addListener.min.js" /> + <Content Include="Scripts\respond.min.js" /> + <TypeScriptCompile Include="Scripts\tests\integration\PlanControllerTests.ts" /> + <Content Include="Scripts\tests\.gitignore" /> + <Content Include="Views\Shared\_AngularAppScripts.cshtml" /> + <TypeScriptCompile Include="Scripts\app\directives\indiClick.ts" /> + <TypeScriptCompile Include="Scripts\app\e2ehttpBackend.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\ContainerControllerTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\TextSource.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\FieldList.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\RadioButtonGroup.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\DropDownListBox.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\FilePicker.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\TextBlock.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\TextBox.spec.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\CounterTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\DurationTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\directives\controls\TextAreaTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\PaneConfigurationActionTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\PlanBuilderControllerTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\unit\services\CrateHelperTests.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\fixture_FieldDTO.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\fixture_ActionDTO.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\directives\controls\fixture_Duration.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\directives\controls\fixture_TextArea.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\fixture_ActionTemplate.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\fixture_ContainerDTO.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\mocks.ts" /> + <TypeScriptCompile Include="Scripts\tests\utils\fixture_PlanBuilder.ts" /> + <Content Include="Scripts\_legacy\about-page.js" /> + <TypeScriptCompile Include="Scripts\app\app.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanBuilderController.ts" /> + <TypeScriptCompile Include="Scripts\app\controllers\PlanListController.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\EventArgsBase.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneConfigureAction\PaneConfigureAction.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneWorkflowDesigner\Messages.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneWorkflowDesigner\PaneWorkflowDesigner.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\directives.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IAppRootScope.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\ICriteria.ts" /> + <TypeScriptCompile Include="Scripts\app\directives\PaneWorkflowDesigner\IPaneWorkflowDesignerScope.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IQueryBuilderWidgetScope.ts" /> + <TypeScriptCompile Include="Scripts\app\model\ActionDTO.ts" /> + <TypeScriptCompile Include="Scripts\app\model\Condition.ts" /> + <TypeScriptCompile Include="Scripts\app\model\Criteria.ts" /> + <TypeScriptCompile Include="Scripts\app\model\Field.ts" /> + <TypeScriptCompile Include="Scripts\app\services\LocalIdentityGenerator.ts" /> + <TypeScriptCompile Include="Scripts\app\services\StringService.ts" /> + <TypeScriptCompile Include="Scripts\app\interfaces\IPlanBuilder.ts" /> + <TypeScriptCompile Include="Scripts\app\services\PlanBuilderService.ts" /> + <Content Include="Scripts\lib\jquery-ui.js" /> + <Content Include="Scripts\_legacy\custom.js" /> + <Content Include="Scripts\_legacy\main.js" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\custom.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\layout.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\blue-hoki.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\blue-steel.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\default.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\green-haze.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\purple-plum.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\purple-studio.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\red-intense.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\red-sunglo.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\yellow-crusta.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\css\themes\yellow-orange.css" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\ajax-loading.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\ajax-modal-loading.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar10.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar11.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar5.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar6.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar7.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar8.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\avatar9.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\icon-color-close.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\icon-color.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\loading-spinner-blue.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\loading-spinner-default.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\loading-spinner-grey.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\loading.gif" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-big-white.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-big.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-blue-hoki.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-blue-steel.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-default.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-green-haze.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-purple-plum.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-purple-studio.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-red-intense.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-red-sunglo.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-yellow-crusta.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo-yellow-orange.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\logo.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\img\menu-toggler.png" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\scripts\demo.js" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\scripts\layout.js" /> + <Content Include="Content\templates\metronic\assets\admin\layout3\scripts\quick-sidebar.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\about-us.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\blog.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\coming-soon.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\error.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\image-crop.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\inbox.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\invoice.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\lock.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\lock2.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\login-soft.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\login.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\login2.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\login3.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\news.css" /> + <Content Include="Content\templates\metronic\tpl\footer.html" /> + <Content Include="Content\templates\metronic\tpl\header.html" /> + <Content Include="Content\templates\metronic\tpl\page-head.html" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\portfolio.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\pricing-table.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\pricing-tables.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\profile-old.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\profile.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\search.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\tasks.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\timeline-old.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\timeline.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\css\todo.css" /> + <Content Include="Content\templates\metronic\assets\admin\pages\img\bg-opacity.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\img\bg-white-lock.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\img\bg-white.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\img\inbox-nav-arrow-blue.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\bg\1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\bg\2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\bg\3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\bg\4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\10.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\11.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\12.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\13.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\14.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\15.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\16.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\17.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\18.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\19.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\20.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\5.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\6.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\7.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\8.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\blog\9.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\article.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\iphone.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\iphone_left.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\iphone_right.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\logo.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo5.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\photo6.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\social_facebook.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\social_googleplus.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\social_linkedin.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\social_rss.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\email\social_twitter.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\invoice\walmart.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\earth.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img1.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img1_2.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img2.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img3.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\pages\img4.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar1_small.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\avatar3_small.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\logo_azteca.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\logo_conquer.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\logo_metronic.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\photo1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\photo2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\photo3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\profile-img.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\profile-img.png" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\profile.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\profile\profile_user.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\search\1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\search\2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\search\img1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\search\img2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\search\img3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_5.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_6.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_7.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\users\avatar80_8.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img1.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img2.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img3.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img4.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img5.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\media\works\img6.jpg" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\calendar.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\charts-amcharts.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\charts-flotcharts.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\coming-soon.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-context-menu.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-dropdowns.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-editors.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-form-tools.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-form-tools2.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-ion-sliders.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-jqueryui-sliders.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-knob-dials.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-nouisliders.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\components-pickers.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\contact-us.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\custom.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ecommerce-index.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ecommerce-orders-view.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ecommerce-orders.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ecommerce-products-edit.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ecommerce-products.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-dropzone.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-editable.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-fileupload.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-icheck.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-image-crop.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-samples.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-validation.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\form-wizard.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\inbox.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\index.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\index3.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\lock.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\login-soft.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\login.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\maps-google.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\maps-vector.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\portfolio.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\portlet-draggable.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\profile.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\search.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\table-advanced.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\table-ajax.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\table-editable.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\table-managed.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\table-tree.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\tasks.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\timeline.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\todo.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-alert-dialog-api.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-blockui.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-bootstrap-growl.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-confirmations.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-datepaginator.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-extended-modals.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-general.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-idletimeout.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-nestable.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-notific8.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-toastr.js" /> + <Content Include="Content\templates\metronic\assets\admin\pages\scripts\ui-tree.js" /> + <Content Include="Content\templates\metronic\assets\global\css\components-md.css" /> + <Content Include="Content\templates\metronic\assets\global\css\components-rounded.css" /> + <Content Include="Content\templates\metronic\assets\global\css\components.css" /> + <Content Include="Content\templates\metronic\assets\global\css\plugins-md.css" /> + <Content Include="Content\templates\metronic\assets\global\css\plugins.css" /> + <Content Include="Content\templates\metronic\assets\global\img\accordion-plusminus.png" /> + <Content Include="Content\templates\metronic\assets\global\img\ajax-loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\ajax-modal-loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\datatable-row-openclose.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ad.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ae.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\af.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ag.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ai.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\al.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\am.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\an.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ao.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ar.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\as.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\at.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\au.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\aw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ax.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\az.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ba.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bb.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bd.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\be.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bi.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bj.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\br.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bs.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\by.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\bz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ca.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\catalonia.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cd.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ch.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ci.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ck.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\co.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cs.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cx.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cy.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\cz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\de.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\dj.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\dk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\dm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\do.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\dz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ec.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ee.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\eg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\eh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\england.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\er.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\es.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\et.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\europeanunion.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fam.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fi.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fj.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\fr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ga.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gb.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gd.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ge.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gi.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gp.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gq.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gs.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\gy.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\hk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\hm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\hn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\hr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ht.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\hu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\id.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ie.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\il.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\in.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\io.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\iq.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ir.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\is.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\it.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\jm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\jo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\jp.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ke.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ki.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\km.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kp.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ky.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\kz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\la.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lb.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\li.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ls.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\lv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ly.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ma.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\md.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\me.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ml.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mp.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mq.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ms.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mx.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\my.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\mz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\na.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ne.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ng.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ni.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\no.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\np.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\nz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\om.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pa.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pe.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ph.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ps.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\pw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\py.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\qa.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\re.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ro.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\rs.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ru.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\rw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sa.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sb.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\scotland.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sd.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\se.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sh.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\si.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sj.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\so.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\st.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sy.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\sz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\td.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\th.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tj.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tl.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\to.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tv.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\tz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ua.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ug.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\um.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\us.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\uy.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\uz.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\va.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\vc.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ve.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\vg.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\vi.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\vn.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\vu.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\wales.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\wf.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ws.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\ye.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\yt.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\za.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\zm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\flags\zw.png" /> + <Content Include="Content\templates\metronic\assets\global\img\input-spinner.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\loading-spinner-blue.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\loading-spinner-default.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\loading-spinner-grey.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\img\overlay-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-collapse-icon-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-collapse-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-config-icon-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-config-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-expand-icon-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-expand-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-reload-icon-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-reload-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-remove-icon-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\portlet-remove-icon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\remove-icon-small.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\aboutme.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\amazon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\behance.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\blogger.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\deviantart.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\dribbble.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\dropbox.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\evernote.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\facebook.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\flickr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\forrst.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\foursquare.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\github.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\googleplus.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\gravatar.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\instagram.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\jolicloud.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\klout.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\last-fm.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\linkedin.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\myspace.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\picasa.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\pintrest.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\quora.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\reddit.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\rss.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\skype.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\spotify.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\stumbleupon.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\tumblr.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\twitter.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\vimeo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\vk.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\wordpress.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\xing.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\yahoo.png" /> + <Content Include="Content\templates\metronic\assets\global\img\social\youtube.png" /> + <Content Include="Content\templates\metronic\assets\global\img\syncfusion-icons-white.png" /> + <Content Include="Content\templates\metronic\assets\global\img\syncfusion-icons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-cookies.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-sanitize.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-touch.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\angular-file-upload\angular-file-upload.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\angular-ui-router.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ocLazyLoad.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-bootstrap-tpls.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-select\select.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-select\select.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-utils\ui-utils-ieshiv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-utils\ui-utils-ieshiv.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\ui-utils\ui-utils.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\autosize\autosize.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\backstretch\jquery.backstretch.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\backstretch\jquery.backstretch.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootbox\bootbox.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\css\colorpicker.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\img\alpha.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\img\hue.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\img\saturation.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\js\bootstrap-colorpicker.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\bootstrap-confirmation.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\bootstrap-confirmation.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\Gruntfile.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-contextmenu\bootstrap-contextmenu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepaginator\bootstrap-datepaginator.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepaginator\bootstrap-datepaginator.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker.standalone.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker.standalone.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker3.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker3.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker3.standalone.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\css\bootstrap-datepicker3.standalone.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\js\bootstrap-datepicker.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\js\bootstrap-datepicker.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ar.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.az.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.bg.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.bs.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ca.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.cs.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.cy.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.da.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.de.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.el.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.en-GB.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.es.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.et.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.eu.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.fa.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.fi.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.fo.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.fr-CH.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.fr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.gl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.he.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.hr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.hu.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.hy.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.id.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.is.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.it-CH.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.it.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ja.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ka.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.kh.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.kk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.kr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.lt.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.lv.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.me.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.mk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ms.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.nb.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.nl-BE.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.nl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.no.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.pl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.pt-BR.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.pt.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ro.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.rs-latin.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.rs.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.ru.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sq.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sr-latin.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sv.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.sw.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.th.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.tr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.uk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.vi.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.zh-CN.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\locales\bootstrap-datepicker.zh-TW.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-daterangepicker\daterangepicker-bs2.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-daterangepicker\daterangepicker-bs3.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-daterangepicker\daterangepicker.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-daterangepicker\moment.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\css\bootstrap-datetimepicker.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\css\bootstrap-datetimepicker.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\bootstrap-datetimepicker.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\bootstrap-datetimepicker.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.is.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.kr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ms.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.pt-BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.rs-latin.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.rs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.sw.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.ua.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\js\locales\bootstrap-datetimepicker.zh-TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\bootstrap-editable\css\bootstrap-editable.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\bootstrap-editable\img\clear.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\bootstrap-editable\img\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\bootstrap-editable\js\bootstrap-editable.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\bootstrap-editable\js\bootstrap-editable.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\CHANGELOG.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\address\address.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\address\address.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\bootstrap-wysihtml5-0.0.2.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\bootstrap-wysihtml5-0.0.2.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\bootstrap-wysihtml5-0.0.2.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\wysihtml5-0.3.0.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\wysihtml5-0.3.0.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\bootstrap-wysihtml5-0.0.2\wysiwyg-color.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\inputs-ext\wysihtml5\wysihtml5.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-fileinput\bootstrap-fileinput.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-fileinput\bootstrap-fileinput.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-growl\demo.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-growl\jquery.bootstrap-growl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-growl\jquery.bootstrap-growl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\bootstrap-gtreetable.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\bootstrap-gtreetable.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\bootstrap-gtreetable.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\bootstrap-gtreetable.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.fa.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.pl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.ru.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.tr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\languages\bootstrap-gtreetable.zh-CN.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-hover-dropdown\bootstrap-hover-dropdown.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-hover-dropdown\bootstrap-hover-dropdown.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\css\bootstrap-markdown.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\js\bootstrap-markdown.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\lib\markdown.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.kr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\locale\bootstrap-markdown.ua.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-maxlength\bootstrap-maxlength.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-maxlength\bootstrap-maxlength.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\css\bootstrap-modal-bs3patch.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\css\bootstrap-modal.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\js\bootstrap-modal.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\js\bootstrap-modalmanager.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-pwstrength\GPL-LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-pwstrength\MIT-LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-pwstrength\pwstrength-bootstrap.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-pwstrength\pwstrength-bootstrap.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-selectsplitter\bootstrap-selectsplitter.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-selectsplitter\bootstrap-selectsplitter.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-cs_CZ.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-cs_CZ.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-de_DE.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-de_DE.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-en_US.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-en_US.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-es_CL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-es_CL.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-eu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-eu.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-fr_FR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-fr_FR.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-it_IT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-it_IT.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-nl_NL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-nl_NL.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-pl_PL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-pl_PL.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-pt_BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-pt_BR.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ro_RO.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ro_RO.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ru_RU.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ru_RU.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ua_UA.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-ua_UA.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-zh_CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-zh_CN.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-zh_TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\i18n\defaults-zh_TW.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-sessiontimeout\jquery.sessionTimeout.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-sessiontimeout\jquery.sessionTimeout.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ar-AR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ca-ES.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-cs-CZ.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-da-DK.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-de-DE.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-es-ES.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-es-EU.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-fa-IR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-fi-FI.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-fr-FR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-hu-HU.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-id-ID.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-it-IT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ja-JP.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ko-KR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-nb-NO.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-nl-NL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-pl-PL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-pt-BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ro-RO.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-ru-RU.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-sk-SK.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-sl-SI.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-sr-RS-Latin.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-sr-RS.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-sv-SE.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-th-TH.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-tr-TR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-uk-UA.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-vi-VN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\lang\summernote-zh-TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\summernote.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\summernote.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\summernote.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\css\bootstrap-switch.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\css\bootstrap-switch.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\js\bootstrap-switch.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\js\bootstrap-switch.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-tabdrop\css\tabdrop.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-tabdrop\js\bootstrap-tabdrop.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\css\bootstrap-timepicker.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\css\bootstrap-timepicker.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\js\bootstrap-timepicker.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\js\bootstrap-timepicker.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\toastr.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\toastr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\toastr.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\toastr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\bootstrap.touchspin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\bootstrap.touchspin.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\bootstrap.touchspin.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\bootstrap.touchspin.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wizard\jquery.bootstrap.wizard.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wizard\jquery.bootstrap.wizard.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wizard\MIT-LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\bootstrap-wysihtml5.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\bootstrap-wysihtml5.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ar-AR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.bg-BG.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ca-CT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.cs-CZ.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.da-DK.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.de-DE.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.el-GR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.es-AR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.es-ES.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.fr-FR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.hr-HR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.it-IT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ja-JP.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ko-KR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.lt-LT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.mo-MD.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.nb-NB.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.nl-NL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.pl-PL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.pt-BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ru-RU.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.sk-SK.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.sv-SE.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.tr-TR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.ua-UA.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\locales\bootstrap-wysihtml5.zh-TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\wysihtml5-0.3.0.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wysihtml5\wysiwyg-color.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\css\bootstrapTheme.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\css\custom.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\css\responsive.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\ico\apple-touch-icon-114-precomposed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\ico\apple-touch-icon-144-precomposed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\ico\apple-touch-icon-57-precomposed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\ico\apple-touch-icon-72-precomposed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\ico\favicon.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\AjaxLoader.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\controls.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\css3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\feather.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\grab.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\modern.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\multi.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\responsive.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\tons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\touch.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\demo-slides\zombie.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\glyphicons-halflings-green.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\glyphicons-halflings-white.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\glyphicons-halflings.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\img\owl-logo.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\application.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\bootstrap-collapse.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\bootstrap-tab.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\bootstrap-transition.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\google-code-prettify\prettify.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\google-code-prettify\prettify.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\google-code-prettify\run_prettify.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\assets\js\jquery-1.9.1.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\changelog.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage5.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage6.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\fullimage7.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl5.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl6.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl7.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\assets\owl8.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\autoHeight.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\click.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\custom.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\customJson.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\full.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\images.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\itemsCustom.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\json.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\lazyLoad.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\manipulations.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\navOnTop.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\navOnTop2.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\one.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\owlStatus.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\progressBar.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\randomOrder.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\scaleup.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\sync.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\transitions.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\AjaxLoader.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\grabbing.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\owl.carousel.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\owl.carousel.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\owl.carousel.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\owl.theme.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\owl.transitions.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\adapters\jquery.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\build-config.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\ckeditor.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\config.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\contents.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\af.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\bn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\bs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\cy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\en-au.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\en-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\en-gb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\en.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\eo.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\eu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\fo.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\fr-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\gu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\hi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\is.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ka.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\km.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ku.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\mk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\mn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ms.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\no.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\pt-br.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\si.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sq.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sr-latn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\tt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\ug.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\zh-cn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\lang\zh.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\a11yhelp.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\cy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\en-gb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\en.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\eo.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\fr-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\gu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\hi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\km.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ku.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\mk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\mn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\no.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\pt-br.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\si.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sq.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sr-latn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\tt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\ug.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\zh-cn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\zh.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\a11yhelp\dialogs\lang\_translationstatus.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\about\dialogs\about.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\about\dialogs\hidpi\logo_ckeditor.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\about\dialogs\logo_ckeditor.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\clipboard\dialogs\paste.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\colordialog\dialogs\colordialog.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\dialog\dialogDefinition.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\div\dialogs\div.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\find\dialogs\find.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\flash\dialogs\flash.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\flash\images\placeholder.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\button.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\checkbox.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\form.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\hiddenfield.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\radio.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\select.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\textarea.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\dialogs\textfield.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\forms\images\hiddenfield.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\icons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\icons_hidpi.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\iframe\dialogs\iframe.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\iframe\images\placeholder.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\image\dialogs\image.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\image\images\noimage.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\link\dialogs\anchor.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\link\dialogs\link.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\link\images\anchor.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\link\images\hidpi\anchor.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\liststyle\dialogs\liststyle.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\magicline\images\hidpi\icon-rtl.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\magicline\images\hidpi\icon.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\magicline\images\icon-rtl.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\magicline\images\icon.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\pagebreak\images\pagebreak.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\pastefromword\filter\default.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\preview\preview.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\scayt\dialogs\options.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\scayt\dialogs\toolbar.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_address.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_blockquote.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_div.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h5.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_h6.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_p.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\showblocks\images\block_pre.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\dialogs\smiley.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\angel_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\angel_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\angry_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\angry_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\broken_heart.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\broken_heart.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\confused_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\confused_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\cry_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\cry_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\devil_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\devil_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\embaressed_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\embarrassed_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\embarrassed_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\envelope.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\envelope.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\heart.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\heart.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\kiss.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\kiss.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\lightbulb.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\lightbulb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\omg_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\omg_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\regular_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\regular_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\sad_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\sad_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\shades_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\shades_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\teeth_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\teeth_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\thumbs_down.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\thumbs_down.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\thumbs_up.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\thumbs_up.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\tongue_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\tongue_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\tounge_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\whatchutalkingabout_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\whatchutalkingabout_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\wink_smile.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\smiley\images\wink_smile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\cy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\en-gb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\en.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\eo.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\fr-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\km.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ku.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\no.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\pt-br.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\si.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\sq.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\tt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\ug.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\zh-cn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\zh.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\lang\_translationstatus.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\specialchar\dialogs\specialchar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\tabletools\dialogs\tableCell.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\table\dialogs\table.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\dialogs\templates.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\dialogs\templates.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\templates\default.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\templates\images\template1.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\templates\images\template2.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\templates\templates\images\template3.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\dialogs\ciframe.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\dialogs\tmpFrameset.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\dialogs\wsc.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\dialogs\wsc.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\dialogs\wsc_ie.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\ajax.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\api.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\appendto.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\assets\inlineall\logo.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\assets\outputxhtml\outputxhtml.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\assets\sample.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\assets\uilanguages\languages.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\datafiltering.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\divreplace.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\inlineall.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\inlinebycode.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\inlinetextarea.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\jquery.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\dialog\assets\my_dialog.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\dialog\dialog.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\enterkey\enterkey.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\htmlwriter\assets\outputforflash\outputforflash.swf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\htmlwriter\assets\outputforflash\swfobject.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\htmlwriter\outputforflash.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\htmlwriter\outputhtml.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\magicline\magicline.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\toolbar\toolbar.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\wysiwygarea\fullpage.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\readonly.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\replacebyclass.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\replacebycode.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\sample.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\sample.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\tabindex.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\uicolor.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\uilanguages.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\xhtmlstyle.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\dialog.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\dialog_ie.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\dialog_ie7.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\dialog_ie8.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\dialog_iequirks.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor_gecko.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor_ie.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor_ie7.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor_ie8.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\editor_iequirks.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\icons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\icons_hidpi.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\arrow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\close.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\hidpi\close.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\hidpi\lock-open.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\hidpi\lock.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\hidpi\refresh.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\lock-open.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\lock.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\images\refresh.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\styles.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\clockface\CHANGELOG.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\clockface\css\clockface.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\clockface\js\clockface.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\jquery.countdown.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\jquery.countdown.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\countdownBasic.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\countdownGlowing.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\countdownLED.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-bn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-bs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-cy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-gu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-hy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-kn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ml.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ms.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-my.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-nb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-pt-BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sq.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sr-SR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-uz.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown-zh-TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\countdown\plugin\jquery.countdown.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\css\cubeportfolio.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\css\cubeportfolio.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\img\cbp-loading-popup.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\img\cbp-loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\img\cbp-sprite.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\js\jquery.cubeportfolio.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\cubeportfolio\js\jquery.cubeportfolio.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\cubeportfolio\readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\all.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\column_render.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\complex_header.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\defaults.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\dom_multiple_elements.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\dom_toolbar.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\dt_events.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\events_live.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\footer_callback.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\html5-data-attributes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\language_file.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\length_menu.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\row_callback.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\row_grouping.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\advanced_init\sort_direction_control.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\custom_data_flat.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\custom_data_property.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\arrays.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\arrays_custom_prop.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\arrays_subobjects.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\objects.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\objects_deep.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\objects_root_array.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\objects_subarrays.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\data\orthogonal.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\deep.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\defer_render.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\null_data_source.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\objects.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\objects_subarrays.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\orthogonal-data.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\ajax\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\add_row.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\api_in_init.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\counter_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\form.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\highlight.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\multi_filter.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\multi_filter_select.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\regex.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\row_details.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\select_row.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\select_single_row.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\show_hide.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\api\tabs_and_scrolling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\alt_pagination.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\comma-decimal.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\complex_header.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\dom.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\filter_only.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\flexible_width.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\hidden_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\language.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\multiple_tables.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\multi_col_sort.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\scroll_x.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\scroll_xy.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\scroll_y.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\scroll_y_theme.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\state_save.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\table_sorting.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\basic_init\zero_configuration.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\data_sources\ajax.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\data_sources\dom.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\data_sources\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\data_sources\js_array.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\data_sources\server_side.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\api.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\dom_sort.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\range_filtering.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\sorting_auto.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\plug-ins\sorting_manual.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\3\dataTables.bootstrap.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\3\dataTables.bootstrap.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\3\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\images\sort_asc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\images\sort_asc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\images\sort_both.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\images\sort_desc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\bootstrap\images\sort_desc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\demo.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\demo.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\details_close.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\details_open.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\de_DE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\dataTables.foundation.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\dataTables.foundation.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\images\sort_asc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\images\sort_asc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\images\sort_both.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\images\sort_desc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\foundation\images\sort_desc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\jqueryui\dataTables.jqueryui.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\jqueryui\dataTables.jqueryui.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\jqueryui\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\syntax\shCore.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\syntax\shCore.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\custom_vars.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\defer_loading.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\ids.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\jsonp.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\object_data.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\pipeline.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\post.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\row_details.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\mysql.sql" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\postgres.sql" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\sqlite.sql" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\sqlserver.sql" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\select_rows.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\bootstrap.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\cell-border.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\compact.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\display.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\foundation.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\hover.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\jqueryUI.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\no-classes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\order-column.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\row-border.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\styling\stripe.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\css\dataTables.autoFill.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\css\dataTables.autoFill.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\complete-callback.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\fill-both.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\fill-horizontal.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\scrolling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\examples\step-callback.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\images\filler.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\js\dataTables.autoFill.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\js\dataTables.autoFill.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\AutoFill\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\css\dataTables.colReorder.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\css\dataTables.colReorder.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\alt_insert.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\colvis.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\col_filter.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\fixedcolumns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\fixedheader.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\jqueryui.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\new_init.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\predefined.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\realtime.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\reset.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\scrolling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\server_side.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\examples\state_save.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\images\insert.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\js\dataTables.colReorder.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\js\dataTables.colReorder.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColReorder\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\css\dataTables.colVis.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\css\dataTables.colvis.jqueryui.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\css\dataTables.colVis.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\button_order.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\exclude_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\group_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\jqueryui.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\mouseover.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\new_init.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\restore.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\text.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\title_callback.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\two_tables.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\examples\two_tables_identical.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\js\dataTables.colVis.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\js\dataTables.colVis.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\ColVis\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\css\dataTables.fixedColumns.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\css\dataTables.fixedColumns.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\bootstrap.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\colvis.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\col_filter.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\css_size.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\index_column.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\left_right_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\right_column.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\rowspan.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\server-side-processing.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\size_fixed.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\size_fluid.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\examples\two_columns.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\js\dataTables.fixedColumns.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\js\dataTables.fixedColumns.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedColumns\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\css\dataTables.fixedHeader.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\css\dataTables.fixedHeader.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\header_footer.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\top_left_right.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\two_tables.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\examples\zIndexes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\js\dataTables.fixedHeader.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\js\dataTables.fixedHeader.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\FixedHeader\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\css\dataTables.keyTable.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\css\dataTables.keyTable.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\examples\events.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\examples\html.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\examples\scrolling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\js\dataTables.keyTable.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\js\dataTables.keyTable.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\KeyTable\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\css\dataTables.responsive.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\column-control.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\custom-renderer.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\disable-child-rows.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\right-column.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\child-rows\whole-row-control.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\display-control\auto.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\display-control\classes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\display-control\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\display-control\init-classes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\initialisation\ajax.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\initialisation\className.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\initialisation\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\initialisation\new.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\initialisation\option.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\styling\bootstrap.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\styling\foundation.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\examples\styling\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\js\dataTables.responsive.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\js\dataTables.responsive.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\css\dataTables.scroller.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\css\dataTables.scroller.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\api_scrolling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\data\2500.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\large_js_source.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\server-side_processing.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\state_saving.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\images\loading-background.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\js\dataTables.scroller.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\js\dataTables.scroller.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\css\dataTables.tableTools.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\css\dataTables.tableTools.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\ajax.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\alter_buttons.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\bootstrap.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\button_text.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\collection.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\defaults.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\jqueryui.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\multiple_tables.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\multi_instance.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\new_init.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\pdf_message.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\plug-in.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\select_column.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\select_multi.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\select_os.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\select_single.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\simple.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\examples\swf_path.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\background.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\collection.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\collection_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\copy.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\copy_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\csv.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\csv_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\pdf.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\pdf_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\print.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\print_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\xls.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\xls_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\js\dataTables.tableTools.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\js\dataTables.tableTools.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\swf\copy_csv_xls.swf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\swf\copy_csv_xls_pdf.swf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\license.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\css\jquery.dataTables.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\css\jquery.dataTables.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\css\jquery.dataTables_themeroller.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\css\jquery.dataTables_themeroller.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\back_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\back_enabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\back_enabled_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\favicon.ico" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\forward_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\forward_enabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\forward_enabled_hover.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\sort_asc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\sort_asc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\sort_both.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\sort_desc.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\sort_desc_disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\js\jquery.dataTables.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\js\jquery.dataTables.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\plugins\bootstrap\dataTables.bootstrap.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\plugins\bootstrap\dataTables.bootstrap.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\css\basic.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\css\dropzone.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\dropzone.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\dropzone.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\images\spritemap%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\images\spritemap.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\excanvas.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\.gitattributes" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\CHANGELOG.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\1_b.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\1_s.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\2_b.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\2_s.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\3_b.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\3_s.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\4_b.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\4_s.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\5_b.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\5_s.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\ajax.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\iframe.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\demo\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\lib\jquery-1.8.2.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\lib\jquery.mousewheel-3.0.6.pack.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\README.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\blank.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\fancybox_loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\fancybox_overlay.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\fancybox_sprite.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\fancybox_buttons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\jquery.fancybox-buttons.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\jquery.fancybox-buttons.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\jquery.fancybox-media.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\jquery.fancybox-thumbs.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\helpers\jquery.fancybox-thumbs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\jquery.fancybox.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\jquery.fancybox.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\source\jquery.fancybox.pack.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.colorhelpers.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.colorhelpers.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.all.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.canvas.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.canvas.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.categories.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.categories.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.crosshair.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.crosshair.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.errorbars.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.errorbars.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.fillbetween.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.fillbetween.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.image.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.image.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.navigate.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.navigate.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.pie.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.pie.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.resize.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.resize.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.selection.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.selection.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.stack.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.stack.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.symbol.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.symbol.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.threshold.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.threshold.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.time.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\jquery.flot.time.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\flot\LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\css\font-awesome.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\css\font-awesome.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\fontawesome-webfont.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fuelux\js\spinner.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fuelux\js\spinner.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\changelog.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\agenda-views.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\basic-views.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\default.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\external-dragging.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\gcal.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\json.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\languages.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\selectable.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\theme.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\timezones.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\fullcalendar.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\fullcalendar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\fullcalendar.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\fullcalendar.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\fullcalendar.print.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\gcal.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang-all.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ar-ma.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ar-sa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\de-at.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\en-au.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\en-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\en-gb.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\fr-ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\hi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\is.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\pt-br.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\sr-cyrl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\zh-cn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lang\zh-tw.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\animated-overlay.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_diagonals-thick_90_eeeeee_40x40.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_flat_15_cd0a0a_40x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_glass_100_e4f1fb_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_glass_50_3baae3_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_glass_80_d7ebf9_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_highlight-hard_100_f2f5f7_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_highlight-hard_70_000000_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_highlight-soft_100_deedf7_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-bg_highlight-soft_25_ffef8f_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-icons_2694e8_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-icons_2e83ff_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-icons_3d80b3_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-icons_72a7cf_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\images\ui-icons_ffffff_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\cupertino\jquery-ui.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\jquery-ui.custom.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\jquery.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\lib\moment.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\license.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gmaps\gmaps.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gmaps\gmaps.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\css\jquery.gritter.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter-blue.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter-brown.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter-light.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter-long.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter-purple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\gritter.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images\ie-spacer.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images_original\gritter-light.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images_original\gritter-long.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images_original\gritter.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images_original\ie-spacer.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\images_original\trees.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\js\jquery.gritter.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\js\jquery.gritter.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\holder.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\.gitignore" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\banner.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\custom.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\icheck.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\arrow-bottom.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\arrow-top.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\header-line.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\icon-fork.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\icon-github.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\icon-lab.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\icon-options.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\ie\icon-star.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-bold.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-regular.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\normalize.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\js\custom.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\js\jquery.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\js\zepto.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\icheck.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\icheck.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\all.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\aero%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\aero.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\aero.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\blue%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\blue.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\blue.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\flat%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\flat.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\flat.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\green%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\green.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\green.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\grey%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\grey.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\grey.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\orange%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\orange.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\orange.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\pink%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\pink.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\pink.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\purple%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\purple.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\purple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\red%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\red.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\red.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\yellow%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\yellow.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\yellow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\flat\_all.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\futurico\futurico%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\futurico\futurico.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\futurico\futurico.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\aero.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\blue.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\green.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\grey.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\line%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\line.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\line.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\orange.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\pink.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\purple.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\red.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\yellow.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\line\_all.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\aero%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\aero.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\aero.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\blue%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\blue.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\blue.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\green%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\green.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\green.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\grey%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\grey.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\grey.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\minimal%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\minimal.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\minimal.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\orange%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\orange.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\orange.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\pink%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\pink.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\pink.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\purple%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\purple.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\purple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\red%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\red.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\red.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\yellow%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\yellow.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\yellow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\minimal\_all.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\polaris\polaris%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\polaris\polaris.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\polaris\polaris.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\aero%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\aero.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\aero.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\blue%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\blue.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\blue.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\green%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\green.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\green.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\grey%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\grey.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\grey.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\orange%402x.png" /> + <Content Include="Scripts\_references.js" /> + <Content Include="Views\Action\ShowAllActionLists.html" /> + <Content Include="Views\Action\ShowAllActions.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\orange.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\orange.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\pink%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\pink.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\pink.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\purple%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\purple.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\purple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\red%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\red.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\red.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\square%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\square.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\square.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\yellow%402x.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\yellow.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\yellow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\skins\square\_all.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\ion.rangeSlider.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\ion.rangeSlider.Metronic.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\ion.rangeSlider.skinFlat.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\ion.rangeSlider.skinNice.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\ion.rangeSlider.skinSimple.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\css\normalize.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\img\sprite-skin-flat.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\img\sprite-skin-nice.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\img\sprite-skin-simple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\js\ion-rangeSlider\ion.rangeSlider.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\js\ion-rangeSlider\ion.rangeSlider.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\js\vendor\jquery-1.11.0.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\css\Jcrop.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\css\jquery.Jcrop.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\css\jquery.Jcrop.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\demos.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\image1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\image2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\image3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\image4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\image5.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\main.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\pool.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\sago.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\sagomod.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\demo_files\sagomod.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\non-image.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\styling.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\tutorial1.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\tutorial2.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\tutorial3.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\tutorial4.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\tutorial5.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\js\jquery.color.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\js\jquery.Jcrop.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\js\jquery.Jcrop.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\js\jquery.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\MIT-LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-bootpag\jquery.bootpag.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-bootpag\jquery.bootpag.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-bootpag\LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\angular.easypiechart.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\angular.easypiechart.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\jquery.easypiechart.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\jquery.easypiechart.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\blueimp-gallery\blueimp-gallery.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\blueimp-gallery\jquery.blueimp-gallery.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\cors\postmessage.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\cors\result.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\demo-ie8.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\demo.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\jquery.fileupload-noscript.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\jquery.fileupload-ui-noscript.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\jquery.fileupload-ui.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\jquery.fileupload.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\css\style.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\img\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\img\progressbar.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\app.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\cors\jquery.postmessage-transport.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\cors\jquery.xdr-transport.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-angular.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-audio.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-image.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-jquery-ui.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-process.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-ui.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-validate.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload-video.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.fileupload.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\jquery.iframe-transport.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\main.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\vendor\canvas-to-blob.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\vendor\jquery.ui.widget.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\vendor\load-image.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\js\vendor\tmpl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-idle-timeout\jquery.idletimeout.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-idle-timeout\jquery.idletimer.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.date.extensions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.extensions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.numeric.extensions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.phone.extensions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\inputmask\jquery.inputmask.regex.extensions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\jquery.inputmask.bundle.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\jquery.inputmask.bundle.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-knob\js\jquery.knob.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-migrate.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\.gitignore" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\index.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\jquery.minicolors.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\jquery.minicolors.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\jquery.minicolors.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\jquery.minicolors.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\without-bootstrap.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-mixitup\.gitignore" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-mixitup\jquery.mixitup.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\css\multi-select.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\img\switch.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\img\switch_original.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\js\jquery.multi-select.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\LICENSE.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-nestable\jquery.nestable.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-nestable\jquery.nestable.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\jquery.notific8.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\jquery.notific8.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\jquery.notific8.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-slimscroll\jquery.slimscroll.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-slimscroll\jquery.slimscroll.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-tags-input\jquery.tagsinput.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-tags-input\jquery.tagsinput.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-tags-input\jquery.tagsinput.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui-touch-punch\jquery.ui.touch-punch.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_diagonals-thick_18_b81900_40x40.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_diagonals-thick_20_666666_40x40.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_flat_10_000000_40x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_glass_100_f6f6f6_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_glass_100_fdf5ce_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_glass_65_ffffff_1x400.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_gloss-wave_35_f6a828_500x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_highlight-soft_100_eeeeee_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-bg_highlight-soft_75_ffe45c_1x100.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-icons_222222_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-icons_228ef1_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-icons_ef8c08_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-icons_ffd27a_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\images\ui-icons_ffffff_256x240.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\jquery-ui.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui\jquery-ui.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\additional-methods.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\additional-methods.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\jquery.validate.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\jquery.validate.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ar.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_bg.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ca.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_cs.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_da.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_de.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_el.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_es.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_es_AR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_es_AR.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_et.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_eu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_eu.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fa.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fi.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_fr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_gl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_he.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_hr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_hu.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_id.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_is.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_is.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_it.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ja.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ka.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ka.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_kk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_kk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ko.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_lt.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_lv.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_my.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_my.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_nl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_no.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_no.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pt_BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pt_BR.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pt_PT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_pt_PT.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ro.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_ru.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_si.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_si.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sr_lat.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sr_lat.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_sv.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_th.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_tj.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_tj.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_tr.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_uk.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_vi.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_zh.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_zh.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_zh_TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\messages_zh_TW.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_de.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_es_CL.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_es_CL.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_fi.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_nl.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_pt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\js\localization\methods_pt.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.blockui.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.cokie.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.easing.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.input-ip-address-control-1.0.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.mockjax.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.parallax.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.pulsate.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.scrollTo.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.sparkline.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\.gitignore" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\data\jquery.vmap.sampledata.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\jquery.vmap.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\jquery.vmap.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\jquery.vmap.packed.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\jqvmap.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\maps\jquery.vmap.europe.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\maps\jquery.vmap.germany.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\maps\jquery.vmap.russia.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\maps\jquery.vmap.usa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\jqvmap\maps\jquery.vmap.world.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\europe.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\germany.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\multi.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\russia.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\usa.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\samples\world.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\jstree.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\jstree.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\32px.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\32px_line.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\32px_original.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\40px.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\style.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\style.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\dist\themes\default\throbber.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\moment.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\area-as-line.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\area.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\bar-colors.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\bar-no-axes.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\bar.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\days.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\decimal-custom-hover.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\diagonal-xlabels-bar.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\diagonal-xlabels.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\donut-colors.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\donut-formatter.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\donut.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\dst.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\events.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\goals.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\lib\example.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\lib\example.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\months-no-smooth.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\negative.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\no-grid.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\non-continuous.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\non-date.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\quarters.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\resize.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\stacked_bars.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\timestamps.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\updating.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\weeks.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\years.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\examples\_template.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\morris.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\morris.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\morris.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\raphael-min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\specs.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\examples.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\exemplary\area0.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\exemplary\bar0.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\exemplary\line0.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\exemplary\stacked_bar0.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\test.html" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\visual_specs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.all.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.all.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.pips.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\jquery.nouislider.pips.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\owl.carousel\assets\owl.carousel.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\owl.carousel\owl.carousel.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\owl.carousel\owl.carousel.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\pace.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\pace.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\themes\pace-theme-barber-shop.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\themes\pace-theme-big-counter.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\themes\pace-theme-flash.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\themes\pace-theme-minimal.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\az.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\bs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\cy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\en.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\hy.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ka.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\kk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\km.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\mn.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ms.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\pt_BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\sq.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\sr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\sr_RS.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\th_TH.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\uk_UA.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\zh_CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\i18n\zh_TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\css\jquery.plupload.queue.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\backgrounds.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\buttons-disabled.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\buttons.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\delete.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\done.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\error.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\throbber.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\img\transp50.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\jquery.plupload.queue.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.plupload.queue\jquery.plupload.queue.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.ui.plupload\css\jquery.ui.plupload.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.ui.plupload\img\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.ui.plupload\img\plupload.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.ui.plupload\jquery.ui.plupload.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\jquery.ui.plupload\jquery.ui.plupload.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\moxie.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\moxie.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\Moxie.swf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\Moxie.xap" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\plupload.dev.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\plupload.full.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\js\plupload.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\license.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\antenna-black.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\antenna-red.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\antenna-yellow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\antenna.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\bigstars.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star-black32.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star-gold32.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star-red32.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star-white32.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star_2.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star_3.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\content\star_4.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\example.htm" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\rateit.aspx" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shBrushCSharp.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shBrushCss.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shBrushJScript.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shBrushXml.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shCore.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shCore.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\example\sh\shCoreDefault.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\delete.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\jquery.rateit.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\jquery.rateit.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\rateit.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\star.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\respond.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2-bootstrap.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2-spinner.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2x2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ar.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_az.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_bg.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ca.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_cs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_da.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_de.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_el.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_es.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_et.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_eu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_fa.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_fi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_fr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_gl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_he.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_hr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_hu.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_id.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_is.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_it.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ja.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ka.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ko.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_lt.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_lv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_mk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ms.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_nl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_no.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_pl.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_pt-BR.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_pt-PT.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ro.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_rs.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ru.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_sk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_sv.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_th.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_tr.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_ug-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_uk.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_vi.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_zh-CN.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_zh-TW.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\fonts\Simple-Line-Icons.dev.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\fonts\Simple-Line-Icons.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\icons-lte-ie7.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\License.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\Readme.txt" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\simple-line-icons.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\simple-line-icons.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\css\blank.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\css\layerslider.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\js\greensock.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\js\jquery.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\js\layerslider.kreaturamedia.jquery.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\js\layerslider.transitions.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark3d\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark3d\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark3d\shadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark3d\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark3d\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark\shadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlessdark\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight3d\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight3d\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight3d\shadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight3d\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight3d\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight\shadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\borderlesslight\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\carousel\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\carousel\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\carousel\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\carousel\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\darkskin\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\darkskin\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\darkskin\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\darkskin\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\defaultskin\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\defaultskin\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\defaultskin\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\defaultskin\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidthdark\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidthdark\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidthdark\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidthdark\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidth\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidth\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidth\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\fullwidth\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\glass\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\glass\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\glass\shadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\glass\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\glass\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\lightskin\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\lightskin\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\lightskin\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\lightskin\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\minimal\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\minimal\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\minimal\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\minimal\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\noskin\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\noskin\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\noskin\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\noskin\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\v5\loading.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\v5\nothumb.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\v5\skin.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\skins\v5\skin.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\css\extralayers.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\css\navstylechange.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\css\noneed.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\css\style.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dbg.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_5.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\3dlayer_6.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\apple.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\bg1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\bg2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\bg3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\bg4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\boat.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\check.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\city.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\citybg.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\clock.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\clock2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\cloud1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\cloud2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\cloud3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\cloud4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\coconuts.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\cycle1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\darkblurbg.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\doublearrow2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\dummy.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\forest1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide1-320x200.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide2-320x200.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide6-320x200.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide6.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide7-320x200.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide7.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide8-320x200.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\fullslide8.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\glare.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\graph.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\greenbg.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\greyline.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\guy1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\guy2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\guy3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\guy4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\guy5.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\hand1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\hill1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\hill2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\hill3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\hill4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb5.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\homeslider_thumb6.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\huge.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\icon_photo.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\imac1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\images\transparent.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\ipad2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\ipad_dark.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\iphone.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\island.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\kenburns1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\kenburns2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\kenburns3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\kenburns4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\kenburns5.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\laptopmockup_sliderdy.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\largegreen.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\logo.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\lupe_imac.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\lupe_macbook.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\macbook2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\newslide2014_1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\newwave1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\newwave2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\newwave32.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\newwave4.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\palm1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\palm2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\parallax_thumb1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\parallax_thumb2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\parallax_thumb3.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\parallax_thumb4.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\people.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\plate1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\plate2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\prebg.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\pulse1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\redbg.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\redbg.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\redbg_big.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\seabg1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\slidebg1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\slidebg1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\slidebg2.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\star.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\stuff.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\sun.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\transparent.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\trans_tile2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\tree.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\videobg1.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\videoshadow.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\video_forest.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\woman.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\woman1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrowleft.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrowright.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_large_left.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_large_right.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_left.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_left2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_right.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrow_right2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\black50.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\boxed_bgtile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\bullet.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\bullets.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\bullets2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\bullet_boxed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\coloredbg.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\grain.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\gridtile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\gridtile_3x3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\gridtile_3x3_white.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\gridtile_white.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\large_left.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\large_right.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\loader.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\loader2.gif" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\navigdots.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\navigdots_bgtile.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\shadow1.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\shadow2.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\shadow3.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\small_left.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\small_left_boxed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\small_right.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\small_right_boxed.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\timer.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\timerdot.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\transparent.jpg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\white50.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\css\settings-ie8.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\css\settings.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\font\revicons.svg" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\decor_inside.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\decor_inside_white.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\decor_testimonial.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\gradient\g30.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\gradient\g40.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\js\jquery.themepunch.enablelog.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\js\jquery.themepunch.revolution.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\js\jquery.themepunch.revolution.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\js\jquery.themepunch.tools.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\smooth-scroll\smooth-scroll.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\tabdrop\css\tabdrop.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\tabdrop\js\bootstrap-tabdrop.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\handlebars.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\typeahead.bundle.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\typeahead.bundle.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\typeahead.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\css\uniform.default.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\css\uniform.default.min.css" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\images\bg-input-focus.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\images\bg-input.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\images\sprite.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\images\sprite_original.png" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\jquery.uniform.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\jquery.uniform.min.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\zoom\jquery.zoom.js" /> + <Content Include="Content\templates\metronic\assets\global\plugins\zoom\jquery.zoom.min.js" /> + <Content Include="Content\templates\metronic\assets\global\scripts\datatable.js" /> + <Content Include="Content\templates\metronic\assets\global\scripts\metronic.js" /> + <Content Include="Content\templates\metronic\index.html" /> + <Content Include="Content\templates\metronic\js\app.js" /> + <Content Include="Content\templates\metronic\js\controllers\DashboardController.js" /> + <Content Include="Content\templates\metronic\js\controllers\GeneralPageController.js" /> + <Content Include="Content\templates\metronic\js\controllers\TodoController.js" /> + <Content Include="Content\templates\metronic\js\controllers\UISelectController.js" /> + <Content Include="Content\templates\metronic\js\controllers\UserProfileController.js" /> + <Content Include="Content\templates\metronic\js\directives.js" /> + <Content Include="Content\templates\metronic\js\scripts\table-advanced.js" /> + <Content Include="Content\templates\metronic\js\scripts\table-ajax.js" /> + <Content Include="Content\templates\metronic\views\dashboard.html" /> + <Content Include="Content\templates\metronic\views\datatables\advanced.html" /> + <Content Include="Content\templates\metronic\views\datatables\ajax.html" /> + <Content Include="Content\templates\metronic\views\dropdowns.html" /> + <Content Include="Content\templates\metronic\views\file_upload.html" /> + <Content Include="Content\templates\metronic\views\form_tools.html" /> + <Content Include="Content\templates\metronic\views\pickers.html" /> + <Content Include="Content\templates\metronic\views\profile\account.html" /> + <Content Include="Content\templates\metronic\views\profile\dashboard.html" /> + <Content Include="Content\templates\metronic\views\profile\help.html" /> + <Content Include="Content\templates\metronic\views\profile\main.html" /> + <Content Include="Content\templates\metronic\views\todo.html" /> + <Content Include="Content\templates\metronic\views\tree.html" /> + <Content Include="Content\templates\metronic\views\ui_bootstrap.html" /> + <Content Include="Content\templates\metronic\views\ui_select.html" /> + <Content Include="gulpfile.js" /> + <Content Include="Content\backgroundsize.min.htc" /> + <Content Include="Content\gadegets.xml" /> + <Content Include="fonts\glyphicons-halflings-regular.svg" /> + <Content Include="Global.asax" /> + <Content Include="fonts\glyphicons-halflings-regular.eot" /> + <Content Include="fonts\glyphicons-halflings-regular.ttf" /> + <Content Include="fonts\glyphicons-halflings-regular.woff" /> + <Content Include="Content\img\.DS_Store" /> + <Content Include="Content\css\additionalcss\bootstrap30\fonts\glyphicons-halflings-regular.eot" /> + <Content Include="Content\css\additionalcss\bootstrap30\fonts\glyphicons-halflings-regular.ttf" /> + <Content Include="Content\css\additionalcss\bootstrap30\fonts\glyphicons-halflings-regular.woff" /> + <Content Include="Content\css\additionalcss\font-awesome\fonts\fontawesome-webfont.eot" /> + <Content Include="Content\css\additionalcss\font-awesome\fonts\fontawesome-webfont.ttf" /> + <Content Include="Content\css\additionalcss\font-awesome\fonts\fontawesome-webfont.woff" /> + <Content Include="Content\css\additionalcss\font-awesome\fonts\FontAwesome.otf" /> + <Content Include="package.json" /> + <Content Include="PreBuild.bat" /> + <Content Include="bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-cookies.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-sanitize.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular-touch.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\angular.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\angular-file-upload\upload.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\autosize\readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\backstretch\LICENSE-MIT" /> + <Content Include="Content\templates\metronic\assets\global\plugins\backstretch\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootbox\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootbox\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-colorpicker\less\colorpicker.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\package.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-confirmation\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-contextmenu\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepaginator\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datepicker\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-daterangepicker\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\less\datetimepicker.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-datetimepicker\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\LICENSE-MIT" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-editable\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-growl\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-growl\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-gtreetable\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-hover-dropdown\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-hover-dropdown\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\less\bootstrap-markdown.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\package.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-markdown\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-maxlength\bootstrap-maxlength.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-maxlength\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-maxlength\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-modal\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-pwstrength\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.css.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\bootstrap-select.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-select\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-selectsplitter\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-selectsplitter\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-selectsplitter\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-sessiontimeout\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-sessiontimeout\package.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-sessiontimeout\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-summernote\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-switch\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-timepicker\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-toastr\toastr.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-touchspin\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\bootstrap-wizard\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\.htaccess" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\json\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\json\customData.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\demos\json\data.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\owl-carousel\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\carousel-owl-carousel\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\CHANGES.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\scayt\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\scayt\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\LICENSE.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\plugins\wsc\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\assets\posteddata.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\plugins\htmlwriter\assets\outputforflash\outputforflash.fla" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\samples\sample_posteddata.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ckeditor\skins\moono\readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\clockface\LICENSE-MIT" /> + <Content Include="Content\templates\metronic\assets\global\plugins\clockface\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\examples.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\font\raleway_thin-webfont.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\font\raleway_thin-webfont.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\font\raleway_thin-webfont.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\jqueryui\dataTables.jqueryui.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\resources\syntax\Syntax Highlighter license" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\ids-arrays.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\ids-objects.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\jsonp.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\objects.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\post.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\server_processing.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\examples\server_side\scripts\ssp.class.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\css\dataTables.responsive.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Responsive\Readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\Scroller\examples\data\ssp.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\psd\collection.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\psd\copy document.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\psd\file_types.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\extensions\TableTools\images\psd\printer.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\media\images\Sorting icons.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\datatables\Readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\css\stylus\basic.styl" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\css\stylus\dropzone.styl" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\dropzone\upload.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\CHANGELOG.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fancybox\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\fontawesome-webfont.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\fontawesome-webfont.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\fontawesome-webfont.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\fontawesome-webfont.woff2" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\fonts\FontAwesome.otf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\animated.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\bordered-pulled.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\core.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\fixed-width.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\font-awesome.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\icons.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\larger.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\list.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\mixins.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\path.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\rotated-flipped.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\stacked.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\less\variables.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_animated.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_bordered-pulled.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_core.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_fixed-width.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_icons.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_larger.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_list.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_mixins.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_path.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_rotated-flipped.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_stacked.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\_variables.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\font-awesome\scss\font-awesome.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fuelux\COPYING" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fuelux\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\json\events.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\php\get-events.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\php\get-timezones.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\fullcalendar\demos\php\utils.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gmaps\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\gritter\README.markdown" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\CHANGELOG.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-bold.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-bold.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-bold.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-regular.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-regular.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\demo\css\montserrat-regular.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\icheck.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\icheck\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\ion.rangeslider\js\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\crop-demo.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\demos\crop.php" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jcrop\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-bootpag\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-easypiechart\Readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-file-upload\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-idle-timeout\README.markdown" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-inputmask\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-knob\knob.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-knob\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-knob\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\component.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\composer.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-minicolors\readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-mixitup\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-mixitup\mixitup.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-mixitup\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-multi-select\README.markdown" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-nestable\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\_notific8.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\_themes.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\jquery.notific8.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\notific8.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-notific8\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-slimscroll\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-slimscroll\slimScroll.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-tags-input\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-ui-touch-punch\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery-validation\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jquery.min.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jqvmap\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\jstree.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\LICENSE-MIT" /> + <Content Include="Content\templates\metronic\assets\global\plugins\jstree\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\less\morris.core.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.area.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.bar.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.donut.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.grid.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.hover.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\lib\morris.line.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\area\area_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\bar\bar_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\bar\colours.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\commas_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\donut\donut_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\grid\auto_grid_lines_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\grid\set_data_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\grid\y_label_format_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\hover_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\label_series_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\line\line_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\pad_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\lib\parse_time_spec.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\support\placeholder.coffee" /> + <Content Include="Content\templates\metronic\assets\global\plugins\morris\spec\viz\run.sh" /> + <Content Include="Content\templates\metronic\assets\global\plugins\nouislider\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\pace\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\plupload\readme.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\rateit\src\jquery.rateit.min.js.map" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\bower.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\component.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\composer.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2.jquery.json" /> + <Content Include="Content\templates\metronic\assets\global\plugins\select2\select2_locale_en.js.template" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\fonts\Simple-Line-Icons.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\fonts\Simple-Line-Icons.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\simple-line-icons\fonts\Simple-Line-Icons.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-layer-slider\js\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\css\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\images\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\arrows.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\bullets.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\assets\small_arrows.psd" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\font\revicons.eot" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\font\revicons.ttf" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\font\revicons.woff" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\images\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\slider-revolution-slider\rs-plugin\js\.DS_Store" /> + <Content Include="Content\templates\metronic\assets\global\plugins\tabdrop\less\tabdrop.less" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\LICENSE" /> + <Content Include="Content\templates\metronic\assets\global\plugins\typeahead\README.md" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\css\uniform.default.scss" /> + <Content Include="Content\templates\metronic\assets\global\plugins\uniform\README.md" /> + <Content Include="Content\medical_intake_form.pdf" /> + <Content Include="Content\Sample Excel Contact List.xlsx" /> + <Content Include="Content\documents\field_trip_permission_form.docx" /> + <Content Include="Content\documents\medical_intake_form.pdf" /> + <Content Include="Content\documents\Sample Excel Contact List.xlsx" /> + <Content Include="packages.config"> + <SubType>Designer</SubType> + </Content> + <Content Include="Content\img\site\Thumbs.db" /> + <None Include="Properties\PublishProfiles\kwasant-rc - FTP %282%29.pubxml" /> + <None Include="Properties\PublishProfiles\kwasant-rc - FTP %283%29.pubxml" /> + <None Include="Properties\PublishProfiles\kwasant-rc - FTP.pubxml" /> + <None Include="Properties\PublishProfiles\kwasant-rc - Web Deploy %282%29.pubxml" /> + <None Include="Properties\PublishProfiles\kwasant-rc - Web Deploy %283%29.pubxml" /> + <None Include="Properties\PublishProfiles\kwasant-rc - Web Deploy.pubxml" /> + <Content Include="Themes\areas.css" /> + <Content Include="Themes\areas\icons.png" /> + <Content Include="Themes\bubble_default.css" /> + <Content Include="Themes\calendar_blue.css" /> + <Content Include="Themes\calendar_g.css" /> + <Content Include="Themes\calendar_green.css" /> + <Content Include="Themes\calendar_traditional.css" /> + <Content Include="Themes\calendar_transparent.css" /> + <Content Include="Themes\calendar_white.css" /> + <Content Include="Themes\legacy\calendar_bronze\delete.gif" /> + <Content Include="Themes\legacy\calendar_bronze\down.png" /> + <Content Include="Themes\legacy\calendar_bronze\left30.gif" /> + <Content Include="Themes\legacy\calendar_bronze\top21.gif" /> + <Content Include="Themes\legacy\calendar_bronze\up.png" /> + <Content Include="Themes\legacy\calendar_silver\corner20.gif" /> + <Content Include="Themes\legacy\calendar_silver\delete.gif" /> + <Content Include="Themes\legacy\calendar_silver\down.png" /> + <Content Include="Themes\legacy\calendar_silver\left45.gif" /> + <Content Include="Themes\legacy\calendar_silver\light_line_10.png" /> + <Content Include="Themes\legacy\calendar_silver\right17.gif" /> + <Content Include="Themes\legacy\calendar_silver\top21.gif" /> + <Content Include="Themes\legacy\calendar_silver\up.png" /> + <Content Include="Themes\legacy\month_silver\event20.gif" /> + <Content Include="Themes\legacy\month_silver\light_line_10.png" /> + <Content Include="Themes\legacy\month_silver\top20.gif" /> + <Content Include="Themes\legacy\navigator_silver\top21.gif" /> + <Content Include="Themes\legacy\scheduler_silver\gradient_dps.jpg" /> + <Content Include="Themes\legacy\scheduler_silver\left45.gif" /> + <Content Include="Themes\legacy\scheduler_silver\light_line_10.png" /> + <Content Include="Themes\legacy\scheduler_silver\top20.gif" /> + <Content Include="Themes\legacy\scheduler_silver\tree_collapse.png" /> + <Content Include="Themes\legacy\scheduler_silver\tree_expand.png" /> + <Content Include="Themes\legacy\scheduler_silver\tree_nochildren.png" /> + <Content Include="Themes\legacy\traditional.css" /> + <Content Include="Themes\menu_default.css" /> + <Content Include="Themes\month_blue.css" /> + <Content Include="Themes\month_g.css" /> + <Content Include="Themes\month_green.css" /> + <Content Include="Themes\month_traditional.css" /> + <Content Include="Themes\month_transparent.css" /> + <Content Include="Themes\month_white.css" /> + <Content Include="Themes\navigator_8.css" /> + <Content Include="Themes\navigator_blue.css" /> + <Content Include="Themes\navigator_g.css" /> + <Content Include="Themes\navigator_green.css" /> + <Content Include="Themes\navigator_transparent.css" /> + <Content Include="Themes\navigator_white.css" /> + <Content Include="Themes\scheduler_8.css" /> + <Content Include="Themes\scheduler_blue.css" /> + <Content Include="Themes\scheduler_green.css" /> + <Content Include="Themes\scheduler_traditional.css" /> + <Content Include="Themes\scheduler_transparent.css" /> + <Content Include="Themes\scheduler_white.css" /> + <Content Include="Themes\scheduler_white\tree_collapse.png" /> + <Content Include="Themes\scheduler_white\tree_expand.png" /> + <Content Include="Themes\scheduler_white\tree_nochildren.png" /> + <Content Include="UnauthorizedRequest.html" /> + <Content Include="tsd.json" /> + <Content Include="Scripts\tests\Chutzpah.json" /> + <None Include="Properties\PublishProfiles\test.pubxml" /> + <Content Include="Web.config"> + <SubType>Designer</SubType> + </Content> + <Content Include="Web.Debug.config"> + <DependentUpon>Web.config</DependentUpon> + </Content> + <Content Include="Web.Release.config"> + <DependentUpon>Web.config</DependentUpon> + </Content> + <Content Include="Views\_ViewStart.cshtml" /> + <Content Include="Views\Shared\Error.cshtml" /> + <Content Include="Views\Shared\_Layout.cshtml" /> + <Content Include="Views\Home\Contact.cshtml" /> + <Content Include="Views\Home\index_docusign.cshtml" /> + <Content Include="Views\DockyardAccount\_ChangePasswordPartial.cshtml" /> + <Content Include="Views\DockyardAccount\_ExternalLoginsListPartial.cshtml" /> + <Content Include="Views\DockyardAccount\_RemoveAccountPartial.cshtml" /> + <Content Include="Views\DockyardAccount\_SetPasswordPartial.cshtml" /> + <Content Include="Views\DockyardAccount\ExternalLoginConfirmation.cshtml" /> + <Content Include="Views\DockyardAccount\ExternalLoginFailure.cshtml" /> + <Content Include="Views\DockyardAccount\Index.cshtml" /> + <Content Include="Views\DockyardAccount\Manage.cshtml" /> + <Content Include="Views\DockyardAccount\Register.cshtml" /> + <Content Include="Views\Shared\_LoginPartial.cshtml" /> + <Content Include="Views\Shared\_Blank.cshtml" /> + <Content Include="Views\DockyardAccount\Confirm.cshtml" /> + <Content Include="Views\Shared\404.cshtml" /> + <Content Include="Views\DockyardAccount\RegistrationConfirmation.cshtml" /> + <Content Include="Views\Dashboard\Index.cshtml" /> + <Content Include="Views\DockyardAccount\ForgotPassword.cshtml" /> + <Content Include="Views\DockyardAccount\ForgotPasswordConfirmation.cshtml" /> + <Content Include="Views\DockyardAccount\ResetPassword.cshtml" /> + <Content Include="Views\DockyardAccount\ResetPasswordConfirmation.cshtml" /> + <Content Include="Views\Shared\_HomeNav.cshtml" /> + <Content Include="Views\Shared\AccessDenied.cshtml" /> + <Content Include="Views\Shared\403.cshtml" /> + <Content Include="Views\AngularTemplate\TextSource.cshtml" /> + <Content Include="Views\AngularTemplate\_PlanList.cshtml" /> + <Content Include="Views\AngularTemplate\SolutionList.cshtml" /> + <Content Include="Views\AuthenticationCallback\Error.cshtml" /> + <Content Include="Views\AngularTemplate\WebServiceList.cshtml" /> + <Content Include="Views\AngularTemplate\ManagePlan.cshtml" /> + <Content Include="Views\AngularTemplate\Duration.cshtml" /> + <Content Include="Views\AngularTemplate\Counter.cshtml" /> + <Content Include="Views\AngularTemplate\_AddPayloadModal.cshtml" /> + <None Include="Views\DocusignAuthCallback\Login.cshtml" /> + <TypeScriptCompile Include="Scripts\tests\utils\services\fixture_CrateHelper.ts" /> + <TypeScriptCompile Include="Scripts\typings\angular-material\angular-material.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\angular-ui-bootstrap.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\angular-ui-router\angular-ui-router.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\angularjs\angular-mocks.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\angularjs\angular-resource.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\angularjs\angular.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\bootstrap-switch\bootstrap-switch.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\jasmine\jasmine.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\jquery.noty\jquery.noty.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\jquery\bootstrap.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\jquery\jquery.d.ts" /> + <TypeScriptCompile Include="Scripts\typings\Metronic.d.ts" /> + <TypeScriptCompile Include="Scripts\app\_all.ts" /> + <TypeScriptCompile Include="Scripts\typings\tsd.d.ts" /> + <Content Include="Views\Home\ConditionalLogicBranching.cshtml" /> + <Content Include="Views\Home\DataExtractionIntoSalesforce.cshtml" /> + <Content Include="Views\Home\DataExtractionIntoServices.cshtml" /> + <Content Include="Views\Home\DataExtractionintoSQLServer.cshtml" /> + <Content Include="Views\Home\IntegrationWithOtherDataServices.cshtml" /> + <Content Include="Views\Home\InterOrganizationWorkflows.cshtml" /> + <Content Include="Views\Home\MultiPartWorkflows.cshtml" /> + <Content Include="Views\Home\index.cshtml" /> + <None Include="Views\JsTests\tests.cshtml" /> + <Content Include="Views\Shared\_JsTestsLayout.cshtml" /> + <TypeScriptCompile Include="Scripts\typings\underscore\underscore.d.ts" /> + </ItemGroup> + <ItemGroup> + <Folder Include="App_Data\" /> + <Folder Include="archive\" /> + <Folder Include="CategoryPages\" /> + <Folder Include="Content\img\forms\" /> + <Folder Include="Content\templates\metronic\assets\global\plugins\angularjs\plugins\angular-file-upload\uploads\" /> + <Folder Include="Content\templates\metronic\demo\" /> + <Folder Include="Controllers\Templates\" /> + <Folder Include="ManifestPages\" /> + <Folder Include="Scripts\app\directives\filters\" /> + <Folder Include="Scripts\tests\templates\" /> + <Folder Include="ViewModelServices\" /> + <Folder Include="Views\CommunicationManager\" /> + <Folder Include="Views\Data\" /> + <Folder Include="Views\DockyardEvent\" /> + <Folder Include="Views\Envelope\" /> + <Folder Include="Views\Settings\" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="Fr8Infrastructure.NET\Fr8Infrastructure.NET.csproj"> + <Project>{bba91af2-7636-41b6-87c4-c1575ae8b04b}</Project> + <Name>Fr8Infrastructure.NET</Name> + </ProjectReference> + <ProjectReference Include="Hub\Hub.csproj"> + <Project>{9891496c-8512-4708-925a-ee9d0f9199d4}</Project> + <Name>Hub</Name> + </ProjectReference> + <ProjectReference Include="Data\Data.csproj"> + <Project>{990241ea-6cf0-4026-b57c-a9031463c7c0}</Project> + <Name>Data</Name> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <Service Include="{508349B6-6B84-4DF5-91F0-309BEEBAD82D}" /> + <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> + </ItemGroup> + <ItemGroup> + <WCFMetadata Include="Service References\" /> + </ItemGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'alexlocal|AnyCPU'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\</OutputPath> + <DefineConstants>DEBUG;TRACE</DefineConstants> + <DebugType>full</DebugType> + <PlatformTarget>AnyCPU</PlatformTarget> + <ErrorReport>prompt</ErrorReport> + <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev|AnyCPU'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\</OutputPath> + <DefineConstants>TRACE;DEBUG;DEV</DefineConstants> + <DebugType>full</DebugType> + <PlatformTarget>x86</PlatformTarget> + <ErrorReport>prompt</ErrorReport> + <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> + <DocumentationFile>bin\HubWeb.XML</DocumentationFile> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Demo|AnyCPU'"> + <DebugSymbols>true</DebugSymbols> + <OutputPath>bin\</OutputPath> + <DefineConstants>TRACE;DEBUG;DEV</DefineConstants> + <DebugType>full</DebugType> + <PlatformTarget>AnyCPU</PlatformTarget> + <ErrorReport>prompt</ErrorReport> + <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> + </PropertyGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|Any CPU'"> + <TypeScriptTarget>ES5</TypeScriptTarget> + <TypeScriptCompileOnSaveEnabled>True</TypeScriptCompileOnSaveEnabled> + <TypeScriptNoImplicitAny>False</TypeScriptNoImplicitAny> + <TypeScriptModuleKind>None</TypeScriptModuleKind> + <TypeScriptRemoveComments>True</TypeScriptRemoveComments> + <TypeScriptOutFile> + </TypeScriptOutFile> + <TypeScriptOutDir> + </TypeScriptOutDir> + <TypeScriptGeneratesDeclarations>False</TypeScriptGeneratesDeclarations> + <TypeScriptNoEmitOnError>True</TypeScriptNoEmitOnError> + <TypeScriptSourceMap>True</TypeScriptSourceMap> + <TypeScriptMapRoot /> + <TypeScriptSourceRoot /> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)' == 'Debug'"> + <TypeScriptModuleKind>amd</TypeScriptModuleKind> + </PropertyGroup> + <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" /> + <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> + <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' == ''" /> + <ProjectExtensions> + <VisualStudio> + <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}"> + <WebProjectProperties> + <SaveServerSettingsInUserFile>True</SaveServerSettingsInUserFile> + </WebProjectProperties> + </FlavorProperties> + </VisualStudio> + </ProjectExtensions> + <PropertyGroup> + <PreBuildEvent> + </PreBuildEvent> + </PropertyGroup> + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. + Other similar extension points exist, see Microsoft.Common.targets. + <Target Name="BeforeBuild"> + </Target> + <Target Name="AfterBuild"> + </Target> --> + <Target Name="EnsureNmpPackageBuildAndGulpBuild" BeforeTargets="BeforeBuild"> + <Exec Command="PreBuild.bat" WorkingDirectory="$(ProjectDir)" /> + <!-- <Exec Command="PreBuild.bat" WorkingDirectory="$(ProjectDir)" ContinueOnError="WarnAndContinue" /> --> + </Target> + <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" /> + <Error Condition="!Exists('packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets'))" /> + </Target> + <PropertyGroup> + <CopyAllFilesToSingleFolderForPackageDependsOn> + CustomCollectFilesHub; + $(CopyAllFilesToSingleFolderForPackageDependsOn); + </CopyAllFilesToSingleFolderForPackageDependsOn> + <CopyAllFilesToSingleFolderForMsdeployDependsOn> + CustomCollectFilesHub; + $(CopyAllFilesToSingleFolderForPackageDependsOn); + </CopyAllFilesToSingleFolderForMsdeployDependsOn> + </PropertyGroup> + <Target Name="CustomCollectFilesHub"> + <ItemGroup> + <_CustomFiles Include=".\bower_components\**\*" /> + <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)"> + <DestinationRelativePath>bower_components\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> + </FilesForPackagingFromProject> + </ItemGroup> + </Target> + <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" /> + <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''"> + <Error Condition="!Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" /> + <Error Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" /> + </Target> + <PropertyGroup> + <PostBuildEvent>if exist $(TargetDir)Web.dll del /Q $(TargetDir)Web.dll</PostBuildEvent> + </PropertyGroup> + <PropertyGroup> + <CompileDependsOn> + $(CompileDependsOn); + GulpBuild; + </CompileDependsOn> + </PropertyGroup> + <Target Name="GulpBuild" DependsOnTargets="CompileTypeScript"> + <Exec Command=".\node_modules\.bin\gulp compile_js" /> + </Target> + <PropertyGroup> + <CopyAllFilesToSingleFolderForPackageDependsOn> + $(CopyAllFilesToSingleFolderForPackageDependsOn); + CollectGulpOutput; + </CopyAllFilesToSingleFolderForPackageDependsOn> + <CopyAllFilesToSingleFolderForMsdeployDependsOn> + $(CopyAllFilesToSingleFolderForMsdeployDependsOn); + CollectGulpOutput; + </CopyAllFilesToSingleFolderForMsdeployDependsOn> + </PropertyGroup> + <PropertyGroup Label="SlowCheetah"> + <SlowCheetahToolsPath>$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\.\packages\SlowCheetah.2.5.15\tools\))</SlowCheetahToolsPath> + <SlowCheetah_EnableImportFromNuGet Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='' ">true</SlowCheetah_EnableImportFromNuGet> + <SlowCheetah_NuGetImportPath Condition=" '$(SlowCheetah_NuGetImportPath)'=='' ">$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\Properties\SlowCheetah\SlowCheetah.Transforms.targets ))</SlowCheetah_NuGetImportPath> + <SlowCheetahTargets Condition=" '$(SlowCheetah_EnableImportFromNuGet)'=='true' and Exists('$(SlowCheetah_NuGetImportPath)') ">$(SlowCheetah_NuGetImportPath)</SlowCheetahTargets> + </PropertyGroup> + <Target Name="CollectGulpOutput"> + <ItemGroup> + <_CustomGulpFiles Include="Scripts\app\_compiled.js" /> + <FilesForPackagingFromProject Include="%(_CustomGulpFiles.Identity)"> + <DestinationRelativePath>Scripts\app\%(Filename)%(Extension)</DestinationRelativePath> + </FilesForPackagingFromProject> + </ItemGroup> + <Message Text="CollectGulpOutput list: %(_CustomGulpFiles.Identity)" /> + </Target> + <PropertyGroup> + <CleanDependsOn> + $(CleanDependsOn); + CleanBowerComponents; + </CleanDependsOn> + <CleanDependsOn> + $(CleanDependsOn); + RemoveCompiledJsFiles; + </CleanDependsOn> + </PropertyGroup> + <Target Name="CleanBowerComponents"> + <RemoveDir Directories="bower_components" /> + </Target> + <Target Name="RemoveCompiledJsFiles"> + <ItemGroup> + <_CompiledJsFiles Include="Scripts\app\**\*.js" /> + </ItemGroup> + <Delete Files="@(_CompiledJsFiles)" /> + </Target> + <Import Project="$(SlowCheetahTargets)" Condition="Exists('$(SlowCheetahTargets)')" Label="SlowCheetah" /> + <Import Project="packages\Microsoft.ApplicationInsights.Agent.Intercept.0.17.0\build\Microsoft.ApplicationInsights.Agent.Intercept.targets" Condition="Exists('packages\Microsoft.ApplicationInsights.Agent.Intercept.0.17.0\build\Microsoft.ApplicationInsights.Agent.Intercept.targets')" /> + <Target Name="BeforeBuild"> + <RestoreSettingsTask SolutionDir="$(SolutionDir)" ProjectDir="$(ProjectDir)" ProjectName="$(ProjectName)" /> + </Target> + <Import Project="packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets" Condition="Exists('packages\Fr8.PrivateSettings.1.2016.214.1\build\net40\Fr8.PrivateSettings.targets')" /> + <Import Project="packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets" Condition="Exists('packages\Fr8.PrivateSettings.1.2016.221.5\build\net40\Fr8.PrivateSettings.targets')" /> +</Project> \ No newline at end of file diff --git a/Infrastructure_HubWeb/Fr8PlanDirectoryAuthenticationAttribute.cs b/Infrastructure_HubWeb/Fr8PlanDirectoryAuthenticationAttribute.cs index c7ac6e8bf5..e6971cb3b4 100644 --- a/Infrastructure_HubWeb/Fr8PlanDirectoryAuthenticationAttribute.cs +++ b/Infrastructure_HubWeb/Fr8PlanDirectoryAuthenticationAttribute.cs @@ -25,7 +25,7 @@ public class Fr8PlanDirectoryAuthenticationAttribute : Attribute, IAuthenticatio protected void Success(HttpAuthenticationContext context, string terminalToken, string userId) { var identity = new Fr8Identity("terminal-" + terminalToken, userId); - var principle = new Fr8Principle(terminalToken, identity, new[] { "Terminal" }); + var principle = new Fr8Principal(terminalToken, identity, new[] { "Terminal" }); Thread.CurrentPrincipal = principle; context.Principal = principle; if (HttpContext.Current != null) diff --git a/Infrastructure_HubWeb/Fr8TerminalAuthenticationAttribute.cs b/Infrastructure_HubWeb/Fr8TerminalAuthenticationAttribute.cs index 12581e7330..296145e2fc 100644 --- a/Infrastructure_HubWeb/Fr8TerminalAuthenticationAttribute.cs +++ b/Infrastructure_HubWeb/Fr8TerminalAuthenticationAttribute.cs @@ -32,7 +32,7 @@ public Fr8TerminalAuthenticationAttribute(bool allowRequestsWithoutUser = false) protected void Success(HttpAuthenticationContext context, string terminalToken, string userId) { var identity = new Fr8Identity("terminal-" + terminalToken, userId); - var principle = new Fr8Principle(terminalToken, identity, new[] { "Terminal" }); + var principle = new Fr8Principal(terminalToken, identity, new[] { "Terminal" }); Thread.CurrentPrincipal = principle; context.Principal = principle; if (HttpContext.Current != null) diff --git a/Infrastructure_PD/Infrastructure/AuthTokenManager.cs b/Infrastructure_PD/Infrastructure/AuthTokenManager.cs new file mode 100644 index 0000000000..ffca763c2a --- /dev/null +++ b/Infrastructure_PD/Infrastructure/AuthTokenManager.cs @@ -0,0 +1,36 @@ +//using System; +//using System.Runtime.Caching; + +//namespace HubWeb.Infrastructure_PD.Infrastructure +//{ +// public class AuthTokenManager : IAuthTokenManager +// { +// private const string TokenToFr8AccountPrefix = "TokenToFr8Account_"; + + +// public string CreateToken(Guid fr8AccountId) +// { +// var token = Guid.NewGuid().ToString(); +// MemoryCache.Default.Add( +// TokenToFr8AccountPrefix + token, +// fr8AccountId.ToString(), +// DateTimeOffset.Now.AddMinutes(10) +// ); + +// return token; +// } + +// public Guid? GetFr8AccountId(string token) +// { +// var fr8AccountId = (string)MemoryCache.Default +// .Get(TokenToFr8AccountPrefix + token); + +// if (string.IsNullOrEmpty(fr8AccountId)) +// { +// return null; +// } + +// return Guid.Parse(fr8AccountId); +// } +// } +//} \ No newline at end of file diff --git a/Infrastructure_PD/Infrastructure/HubAuthenticationPDHeaderSignature.cs b/Infrastructure_PD/Infrastructure/HubAuthenticationPDHeaderSignature.cs new file mode 100644 index 0000000000..244e55de38 --- /dev/null +++ b/Infrastructure_PD/Infrastructure/HubAuthenticationPDHeaderSignature.cs @@ -0,0 +1,19 @@ +//using System.Net.Http; +//using Fr8.Infrastructure.Interfaces; + +//namespace PlanDirectory.Infrastructure +//{ +// public class HubAuthenticationPDHeaderSignature : IRequestSignature +// { +// private readonly string _fr8Token; +// public HubAuthenticationPDHeaderSignature(string token, string userId) +// { +// _fr8Token = $"key={token}" + (string.IsNullOrEmpty(userId) ? "" : $", user={userId}"); +// } + +// public void SignRequest(HttpRequestMessage request) +// { +// request.Headers.Add(System.Net.HttpRequestHeader.Authorization.ToString(), $"FR8-PD {_fr8Token}"); +// } +// } +//} \ No newline at end of file diff --git a/Infrastructure_PD/Infrastructure/PlanDirectoryAuthorizeAttribute.cs b/Infrastructure_PD/Infrastructure/PlanDirectoryAuthorizeAttribute.cs new file mode 100644 index 0000000000..6dc400efa2 --- /dev/null +++ b/Infrastructure_PD/Infrastructure/PlanDirectoryAuthorizeAttribute.cs @@ -0,0 +1,18 @@ +//using System.Web; +//using System.Web.Mvc; +//using Hub.Managers; + +//namespace PlanDirectory.Infrastructure +//{ +// public class PlanDirectoryAuthorizeAttribute : DockyardAuthorizeAttribute +// { +// public PlanDirectoryAuthorizeAttribute(params string[] roles) : base(roles) +// { +// } + +// protected override string BuildRedirectUrl(AuthorizationContext context) +// { +// return VirtualPathUtility.ToAbsolute("~/Reauthenticate"); +// } +// } +//} \ No newline at end of file diff --git a/Infrastructure_PD/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs b/Infrastructure_PD/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs new file mode 100644 index 0000000000..b184e6f894 --- /dev/null +++ b/Infrastructure_PD/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs @@ -0,0 +1,51 @@ +//using System.Configuration; +//using System.Security.Principal; +//using System.Threading; +//using System.Threading.Tasks; +//using System.Web; +//using System.Web.Http.Filters; +//using Fr8.Infrastructure.Security; +//using Fr8.Infrastructure.Utilities.Configuration; +//using Hub.Infrastructure; + +//namespace PlanDirectory.Infrastructure +//{ +// public class PlanDirectoryHMACAuthenticateAttribute : fr8HMACAuthenticateAttribute +// { +// private const string TerminalId = "PlanDirectory"; + + +// public PlanDirectoryHMACAuthenticateAttribute() +// { +// } + +// protected override void Success(HttpAuthenticationContext context, string terminalId, string userId) +// { +// var identity = new Fr8Identity("terminal-" + terminalId, userId); +// var principle = new GenericPrincipal(identity, new string[] { }); + +// Thread.CurrentPrincipal = principle; +// context.Principal = principle; + +// if (HttpContext.Current != null) +// { +// HttpContext.Current.User = principle; +// } +// } + +// protected override Task<string> GetTerminalSecret(string terminalId) +// { +// if (terminalId == TerminalId) +// { +// return Task.FromResult(CloudConfigurationManager.GetSetting("PlanDirectorySecret")); +// } + +// return Task.FromResult<string>(null); +// } + +// protected override Task<bool> CheckPermission(string terminalId, string userId) +// { +// return Task.FromResult(true); +// } +// } +//} \ No newline at end of file diff --git a/Infrastructure_PD/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs b/Infrastructure_PD/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs new file mode 100644 index 0000000000..6e0f6c1aea --- /dev/null +++ b/Infrastructure_PD/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs @@ -0,0 +1,25 @@ +//using Fr8.Infrastructure.Interfaces; +//using Fr8.TerminalBase.Interfaces; +//using Fr8.TerminalBase.Services; + +//namespace PlanDirectory.Infrastructure +//{ +// public class PlanDirectoryHubCommunicatorFactory : IHubCommunicatorFactory +// { +// private readonly string _apiUrl; +// private readonly string _terminalToken; +// private readonly IRestfulServiceClientFactory _factory; +// public PlanDirectoryHubCommunicatorFactory(IRestfulServiceClientFactory factory, string apiUrl, string terminalToken) +// { +// _apiUrl = apiUrl; +// _terminalToken = terminalToken; +// _factory = factory; +// } + +// public IHubCommunicator Create(string userId) +// { +// var restfulServiceClient = _factory.Create(new HubAuthenticationPDHeaderSignature(_terminalToken, userId)); +// return new DefaultHubCommunicator(restfulServiceClient, _apiUrl, _terminalToken, userId); +// } +// } +//} diff --git a/Infrastructure_PD/Interfaces/IAuthTokenManager.cs b/Infrastructure_PD/Interfaces/IAuthTokenManager.cs new file mode 100644 index 0000000000..ca970b9d94 --- /dev/null +++ b/Infrastructure_PD/Interfaces/IAuthTokenManager.cs @@ -0,0 +1,10 @@ +//using System; + +//namespace PlanDirectory.Interfaces +//{ +// public interface IAuthTokenManager +// { +// string CreateToken(Guid fr8AccountId); +// Guid? GetFr8AccountId(string token); +// } +//} diff --git a/Infrastructure_PD/Interfaces/IHubCommunicatorFactory.cs b/Infrastructure_PD/Interfaces/IHubCommunicatorFactory.cs new file mode 100644 index 0000000000..10124a3e93 --- /dev/null +++ b/Infrastructure_PD/Interfaces/IHubCommunicatorFactory.cs @@ -0,0 +1,9 @@ +//using Fr8.TerminalBase.Interfaces; + +//namespace PlanDirectory.Interfaces +//{ +// public interface IHubCommunicatorFactory +// { +// IHubCommunicator Create(string userId); +// } +//} diff --git a/LICENSE b/LICENSE index 8dada3edaf..0444cdaaa8 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,180 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/LICENSE-apache b/LICENSE-apache new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/LICENSE-apache @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Services/PlanDirectory/Scripts/PlanDirectoryApp.js b/Scripts/PlanDirectoryApp.js similarity index 86% rename from Services/PlanDirectory/Scripts/PlanDirectoryApp.js rename to Scripts/PlanDirectoryApp.js index 09a2c6a881..bcee723b8b 100644 --- a/Services/PlanDirectory/Scripts/PlanDirectoryApp.js +++ b/Scripts/PlanDirectoryApp.js @@ -18,7 +18,7 @@ $scope.pages = []; var doSearch = function (pageStart) { - var url = urlPrefix + '/api/plan_templates/search' + var url = urlPrefix + '/api/v1/plan_templates/search' + '?text=' + $scope.searchForm.searchText + '&pageStart=' + pageStart + '&pageSize=' + $scope.pageSize; @@ -28,12 +28,12 @@ var promise = $q(function (resolve, reject) { $http.get(url) .then(function (res) { - $scope.totalCount = res.data.TotalCount; - $scope.planTemplates = res.data.PlanTemplates; + $scope.totalCount = res.data.totalCount; + $scope.planTemplates = res.data.planTemplates; $scope.currentPage = pageStart; $scope.pages = []; - for (var i = 0; i < Math.ceil(res.data.TotalCount / $scope.pageSize) ; ++i) { + for (var i = 0; i < Math.ceil(res.data.totalCount / $scope.pageSize) ; ++i) { $scope.pages.push(i + 1); } @@ -51,7 +51,7 @@ }; var checkAuthentication = function () { - var url = urlPrefix + '/api/authentication/is_authenticated'; + var url = urlPrefix + '/api/v1/authentication/is_authenticated'; var promise = $q(function (resolve, reject) { $http.get(url) @@ -67,7 +67,7 @@ }; var checkPrivileged = function () { - var url = urlPrefix + '/api/authentication/is_privileged'; + var url = urlPrefix + '/api/v1/authentication/is_privileged'; var promise = $q(function (resolve, reject) { $http.get(url) @@ -100,11 +100,11 @@ Metronic.unblockUI(); } else { - var url = urlPrefix + '/api/plan_templates/createplan/?id=' + planTemplate.ParentPlanId; + var url = urlPrefix + '/api/v1/plan_templates/createplan/?id=' + planTemplate.parentPlanId; $http.post(url, null) .then(function (data) { Metronic.unblockUI(); - window.location.href = data.data.RedirectUrl; + window.location.href = data.data.redirectUrl; }); } }) @@ -116,7 +116,7 @@ $scope.removePlan = function (planTemplate) { Metronic.blockUI({ animate: true }); - var url = urlPrefix + '/api/plan_templates/?id=' + planTemplate.ParentPlanId; + var url = urlPrefix + '/api/v1/plan_templates/?id=' + planTemplate.parentPlanId; $http.delete(url) .then(function (data) { Metronic.unblockUI(); @@ -125,7 +125,7 @@ }; $scope.generatePages = function() { - var url = urlPrefix + '/api/plan_templates/generatepages'; + var url = urlPrefix + '/api/v1/plan_templates/generatepages'; $http.post(url, null); } diff --git a/Services/PlanDirectory/Scripts/main.js b/Scripts/PlanDirectoryMain.js similarity index 99% rename from Services/PlanDirectory/Scripts/main.js rename to Scripts/PlanDirectoryMain.js index 99b607789d..ff27ac1c5e 100644 --- a/Services/PlanDirectory/Scripts/main.js +++ b/Scripts/PlanDirectoryMain.js @@ -7,7 +7,7 @@ } else { setNavbarLight(); } - } + } function setNavbarLight() { $('.navbar').addClass('navbar-light'); diff --git a/Scripts/app/app.ts b/Scripts/app/app.ts index 4d123ee8c2..cc19e008b2 100644 --- a/Scripts/app/app.ts +++ b/Scripts/app/app.ts @@ -196,16 +196,13 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$locationP // Install a HTTP request interceptor that causes 'Processing...' message to display $httpProvider.interceptors.push(['$q', '$window', ($q: ng.IQService, $window: ng.IWindowService) => { - return { + return <any>{ request: (config: ng.IRequestConfig) => { // Show page spinner If there is no request parameter suppressSpinner. if (config && config.params && config.params['suppressSpinner']) { // We don't want this parameter to be sent to backend so remove it if found. delete (config.params.suppressSpinner); } - else { - // Metronic.startPageLoading(<Metronic.PageLoadingOptions>{ animate: true }); - } return config; }, response: (config: ng.IRequestConfig) => { @@ -216,8 +213,8 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$locationP //Andrei Chaplygin: not applicable as this is a valid response from methods signalling that user is authorized but doesn't have sufficient priviligies //All unauthorized requests are handled (and redirected to login page) by built-in functionality (authorize attributes) if (config.status === 403) { - $window.location.href = $window.location.origin + '/DockyardAccount' - + '?returnUrl=/dashboard' + encodeURIComponent($window.location.hash); + $window.location.href = $window.location.origin + '/DockyardAccount/InterceptLogin' + + '?returnUrl=' + encodeURIComponent($window.location.pathname + $window.location.search); } Metronic.stopPageLoading(); return $q.reject(config); @@ -225,122 +222,6 @@ app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$locationP } }]); - class ApiRequestCoordinatorService { - private configurePattern: string = 'activities/configure'; - private savePattern: string = 'activities/save'; - private currentConfigurationRequests: string[] = []; - - // If the function returns false, request must be rejected. If true, the request can proceed. - public startRequest(url: string, activityId: string): boolean { - if (url.indexOf(this.configurePattern) > -1) { - // check if such activity is currently being configured. if so, reject the request. - if (this.currentConfigurationRequests.indexOf(activityId) > -1) { - return false; - } - else { - // if not, add it in the list of configured activities - this.currentConfigurationRequests.push(activityId); - } - } - - else if (url.indexOf(this.savePattern) > -1) { - if (this.currentConfigurationRequests.indexOf(activityId) > -1) { - return false; - } - } - - return true; - } - - public endRequest(url: string, activityId: string) { - if (url.indexOf(this.configurePattern) == -1) return; - - // check if such activity is currently being configured. if so, remove it from the array - let idx: number = this.currentConfigurationRequests.indexOf(activityId); - if (idx > -1) { - this.currentConfigurationRequests.splice(idx, 1); - } - } - } - - app.service('ApiRequestCoordinatorService', [ApiRequestCoordinatorService]); - - - // Install a HTTP request interceptor that syncronizes Save and Config requests for a single activity. - // If a Configure request is currently executing, Save and other Configure requests will be dropped. - // See FR-3475 for rationale. - $httpProvider.interceptors.push(['$q', ($q: ng.IQService) => { - - // Since we cannot reference services from initialization code, we define a nested class and instantiate it. - class ApiRequestCoordinatorService { - private configurePattern: string = 'activities/configure'; - private savePattern: string = 'activities/save'; - private currentConfigurationRequests: string[] = []; - - // If the function returns false, request must be rejected. If true, the request can proceed. - public startRequest(url: string, activityId: string): boolean { - if (url.indexOf(this.configurePattern) > -1) { - // check if such activity is currently being configured. if so, reject the request. - if (this.currentConfigurationRequests.indexOf(activityId) > -1) { - return false; - } - else { - // if not, add it in the list of configured activities - this.currentConfigurationRequests.push(activityId); - } - } - - else if (url.indexOf(this.savePattern) > -1) { - if (this.currentConfigurationRequests.indexOf(activityId) > -1) { - return false; - } - } - return true; - } - - public endRequest(url: string, activityId: string) { - if (url.indexOf(this.configurePattern) == -1) return; - - // check if such activity is currently being configured. if so, remove it from the array - let idx: number = this.currentConfigurationRequests.indexOf(activityId); - if (idx > -1) { - this.currentConfigurationRequests.splice(idx, 1); - } - } - } - - let apiRequestCoordinatorService = new ApiRequestCoordinatorService(); - - return { - request: (config) => { - // bypass any requests which are not of interest for us - if (config.method != 'POST') return config; - if (!config.params || !config.params.id) return config; - if (!apiRequestCoordinatorService.startRequest(config.url, config.params.id)) { - var canceler = $q.defer(); - config.timeout = canceler.promise; - canceler.resolve(); - } - return config; - }, - - response: (response) => { - let config = response.config; - if (!config.url) return response; - if (!response.data || !response.data.id) return response; - apiRequestCoordinatorService.endRequest(config.url, response.data.id) - return response; - }, - - responseError: (response) => { - if (!response.url) return $q.reject(response); - if (!response.data || !response.data.id) return $q.reject(response); - apiRequestCoordinatorService.endRequest(response.url, response.data.id) - return $q.reject(response); - } - } - }]); - // Redirect any unmatched url $urlRouterProvider.otherwise("/myaccount"); diff --git a/Scripts/app/controllers/AuthenticationDialogController.ts b/Scripts/app/controllers/AuthenticationDialogController.ts index 8ebb875ae8..77fc77438a 100644 --- a/Scripts/app/controllers/AuthenticationDialogController.ts +++ b/Scripts/app/controllers/AuthenticationDialogController.ts @@ -291,7 +291,6 @@ // Save previously selected auth tokens. if ($scope.terminals) { - console.log($scope.terminals); angular.forEach($scope.terminals, function (term) { if (term.authTokens.length !== 0) { selectedAuthTokens.push({ diff --git a/Scripts/app/controllers/InternalAuthenticationController.ts b/Scripts/app/controllers/InternalAuthenticationController.ts index 03d58ee5f4..1a17b7b2fb 100644 --- a/Scripts/app/controllers/InternalAuthenticationController.ts +++ b/Scripts/app/controllers/InternalAuthenticationController.ts @@ -11,25 +11,29 @@ private $http: ng.IHttpService) { var _loading = false; - $scope.authError = false; $scope.authErrorText = null; - $scope.mode = $scope.mode; + $scope.showDomain = $scope.mode == 4 ? 1 : 0; // 4 - AuthenticationMode.InternalModeWithDomain - // 4 - AuthenticationMode.InternalModeWithDomain - $scope.showDomain = $scope.mode == 4 ? 1 : 0; - $scope.formData = { - username: 'docusign_developer@dockyard.company', - password: 'grolier34', - domain: "dockyard.company", - isDemoAccount: false - }; + $scope.formData = {}; + // Checking for pre-defined account information + $http.get('/api/authentication/demoAccountInfo', { params: { terminal: $scope.terminal.name } }) + .then(function (res: any) { + if (res.data && res.data.hasDemoAccount) { + $scope.formData = { + username: res.data.username, + password: res.data.password, + domain: res.data.domain + }; + } + }); $scope.isLoading = function () { return _loading; }; + // At the moment, only Docusign provides demo service $scope.hasDemoService = function () { return $scope.terminalName == "terminalDocuSign"; } @@ -38,6 +42,9 @@ if (!$scope.form.$valid) { return; } + + _loading = true; + var data = { Terminal: $scope.terminal, Username: $scope.formData.username, @@ -46,11 +53,8 @@ IsDemoAccount: $scope.formData.isDemoAccount }; - _loading = true; - $http.post('/api/authentication/token', data) .then(function (res: any) { - if (res.data.error) { $scope.authErrorText = res.data.error; } diff --git a/Scripts/app/controllers/PlanBuilderController.ts b/Scripts/app/controllers/PlanBuilderController.ts index d4667e2197..3c5429b974 100644 --- a/Scripts/app/controllers/PlanBuilderController.ts +++ b/Scripts/app/controllers/PlanBuilderController.ts @@ -238,7 +238,7 @@ module dockyard.controllers { }; $scope.state = $state.current.name; - this.processState($state); + this.processState($state); } private handleBackButton(event, toState, toParams, fromState, fromParams, options) { @@ -423,8 +423,9 @@ module dockyard.controllers { private reloadFirstActions() { this.$timeout(() => { - if (this.$scope.current.plan.planState != dockyard.model.PlanState.Running) { - this.$scope.current.plan.subPlans.forEach( + var currentPlan = this.$scope.current.plan; + if (currentPlan.planState !== dockyard.model.PlanState.Executing || currentPlan.planState !== dockyard.model.PlanState.Active) { + currentPlan.subPlans.forEach( plan => { if (plan.activities.length > 0) { this.$scope.reConfigureAction(plan.activities[0]) @@ -485,7 +486,10 @@ module dockyard.controllers { this.$scope.$on(pca.MessageType[pca.MessageType.PaneConfigureAction_ChildActionsDetected], () => this.PaneConfigureAction_ChildActionsDetected()); this.$scope.$on(pca.MessageType[pca.MessageType.PaneConfigureAction_ExecutePlan], () => this.PaneConfigureAction_ExecutePlan()); - this.$scope.$on(<any>designHeaderEvents.PLAN_EXECUTION_FAILED, () => this.reloadFirstActions()); + this.$scope.$on(<any>designHeaderEvents.PLAN_EXECUTION_FAILED, () => { + this.$scope.current.plan.planState = model.PlanState.Inactive; + this.reloadFirstActions(); + }); // Handles Response from Configure call from PaneConfiguration this.$scope.$on(pca.MessageType[pca.MessageType.PaneConfigureAction_ConfigureCallResponse], @@ -530,6 +534,8 @@ module dockyard.controllers { var actionGroups = this.LayoutService.placeActions(activities, subPlan.id); this.$scope.processedSubPlans.push({ subPlan: subPlan, actionGroups: actionGroups }); } + + this.$scope.$emit('onKioskModalLoad'); } private renderActions(activitiesCollection: model.ActivityDTO[]) { @@ -537,7 +543,7 @@ module dockyard.controllers { if (activitiesCollection != null && activitiesCollection.length !== 0) { this.$scope.actionGroups = this.LayoutService.placeActions(activitiesCollection, this.$scope.current.plan.startingSubPlanId); - } + } } // If action updated, notify interested parties and update $scope.current.action @@ -632,8 +638,6 @@ module dockyard.controllers { var id = this.LocalIdentityGenerator.getNextId(); var parentId = eventArgs.group.parentId; var action = new model.ActivityDTO(this.$scope.planId, parentId, id); - - action.name = activityTemplate.label; // Add action to Workflow Designer. this.$scope.current.activities = action.toActionVM(); this.$scope.current.activities.activityTemplate = this.ActivityTemplateHelperService.toSummary(activityTemplate); @@ -680,7 +684,7 @@ module dockyard.controllers { private selectAction(action: model.ActivityDTO, group: model.ActionGroup, $window) { //this performs a call to Segment service for analytics if ($window['analytics'] != null) { - $window['analytics'].track("Added Activity To Plan", { "Activity Name": action.name }); + $window['analytics'].track("Added Activity To Plan", { "Activity Name": action.activityTemplate.name }); } console.log("Activity selected: " + action.id); var originalId, @@ -756,7 +760,6 @@ module dockyard.controllers { */ private PaneConfigureAction_ActionUpdated(updatedAction: model.ActivityDTO) { var action = this.findActionById(updatedAction.id); - action.name = updatedAction.name; action.label = updatedAction.label; } diff --git a/Scripts/app/controllers/PlanDetailsController.ts b/Scripts/app/controllers/PlanDetailsController.ts index 58facfced6..c092aa3b66 100644 --- a/Scripts/app/controllers/PlanDetailsController.ts +++ b/Scripts/app/controllers/PlanDetailsController.ts @@ -76,7 +76,8 @@ module dockyard.controllers { $scope.unpublishPlan = () => { - if ($scope.current.plan.visibility.public) { + //tony.yakovets: temporary crutch + if (!$scope.current.plan.visibility.hidden) { PlanService.unpublish($stateParams.id) .then(() => { console.log('unpublishPlan: Success'); diff --git a/Scripts/app/controllers/PlanListController.ts b/Scripts/app/controllers/PlanListController.ts index 34bb32a4d1..3ba28f5fc8 100644 --- a/Scripts/app/controllers/PlanListController.ts +++ b/Scripts/app/controllers/PlanListController.ts @@ -28,6 +28,13 @@ module dockyard.controllers { inActiveQuery: model.PlanQueryDTO; inActivePromise: ng.IPromise<model.PlanResultDTO>; inActivePlans: model.PlanResultDTO; + + executingQuery: model.PlanQueryDTO; + executingPromise: ng.IPromise<model.PlanResultDTO>; + executingPlans: model.PlanResultDTO; + getExecutingPlans: () => void; + + activeOrExecutingPlans: (plans: model.PlanDTO) => boolean; getInactivePlans: () => void; removeInactiveFilter: () => void; @@ -37,6 +44,7 @@ module dockyard.controllers { activePlans: model.PlanResultDTO; getActivePlans: () => void; removeActiveFilter: () => void; + } /* @@ -86,17 +94,23 @@ module dockyard.controllers { }; $scope.inActiveQuery = new model.PlanQueryDTO(); - $scope.inActiveQuery.status = 1; + $scope.inActiveQuery.status = model.PlanState.Inactive; $scope.inActiveQuery.planPerPage = 10; $scope.inActiveQuery.page = 1; $scope.inActiveQuery.orderBy = "-lastUpdated"; $scope.activeQuery = new model.PlanQueryDTO(); - $scope.activeQuery.status = 2; + $scope.activeQuery.status = model.PlanState.Active; $scope.activeQuery.planPerPage = 10; $scope.activeQuery.page = 1; $scope.activeQuery.orderBy = "-lastUpdated"; + $scope.executingQuery = new model.PlanQueryDTO(); + $scope.executingQuery.status = model.PlanState.Executing; + $scope.executingQuery.planPerPage = 10; + $scope.executingQuery.page = 1; + $scope.executingQuery.orderBy = "-lastUpdated"; + $scope.Query = new model.PlanQueryDTO(); $scope.Query.planPerPage = 20; $scope.Query.page = 1; @@ -112,10 +126,10 @@ module dockyard.controllers { $scope.updatePlansLastUpdated = <(id: any, date: any) => void>angular.bind(this, this.updatePlanLastUpdated); $scope.getInactivePlans = <() => void>angular.bind(this, this.getInactivePlans); $scope.getActivePlans = <() => void>angular.bind(this, this.getActivePlans); + $scope.getExecutingPlans = <() => void>angular.bind(this, this.getExecutingPlans); $scope.removeInactiveFilter = <() => void>angular.bind(this, this.removeInactiveFilter); $scope.removeActiveFilter = <() => void>angular.bind(this, this.removeActiveFilter); - $scope.$watch('inActiveQuery.filter', (newValue, oldValue) => { var bookmark: number = 1; if (!oldValue) { @@ -130,6 +144,10 @@ module dockyard.controllers { this.getInactivePlans(); }); + $scope.activeOrExecutingPlans = function (plan: model.PlanDTO) { + return plan.planState === model.PlanState.Active || plan.planState === model.PlanState.Executing; + } + $scope.addPlan = function () { var plan = new dockyard.model.PlanDTO(); plan.planState = dockyard.model.PlanState.Inactive; @@ -137,11 +155,10 @@ module dockyard.controllers { //plan.visibility = dockyard.model.PlanVisibility.Standard; var result = PlanService.save(plan); - result.$promise - .then(() => { - $state.go('plan', { id: result.id }); - //window.location.href = 'plans/' + result.plan.id + '/builder'; - }); + result.$promise.then(() => { + $state.go('plan', { id: result.id }); + //window.location.href = 'plans/' + result.plan.id + '/builder'; + }); }; @@ -191,14 +208,14 @@ module dockyard.controllers { this.$scope.activePlans.plans = []; this.$scope.activePlans.totalPlanCount = 0; data.plans.map( - plan => { - if (plan.planState === 1) { + plan => { + if (plan.planState === model.PlanState.Inactive) { this.$scope.inActivePlans.plans.push(plan); this.$scope.inActivePlans.totalPlanCount++; - } else if (plan.planState === 2){ + } else if (plan.planState === model.PlanState.Active || plan.planState === model.PlanState.Executing) { this.$scope.activePlans.plans.push(plan); this.$scope.activePlans.totalPlanCount++; - } + } } ); }); @@ -215,13 +232,20 @@ module dockyard.controllers { this.$scope.activePromise = this.PlanService.getByQuery(this.$scope.activeQuery).$promise; this.$scope.activePromise.then((data: model.PlanResultDTO) => { this.$scope.activePlans = data; - }); + }); + } + + private getExecutingPlans() { + this.$scope.executingPromise = this.PlanService.getByQuery(this.$scope.executingQuery).$promise; + this.$scope.executingPromise.then((data: model.PlanResultDTO) => { + this.$scope.activePlans.plans.concat(data.plans); + this.$scope.activePlans.totalPlanCount += data.totalPlanCount; + }); } private reArrangePlans(plan) { - var planIndex = null; - if (plan.planState === 1) { + if (plan.planState === model.PlanState.Inactive) { planIndex = this.$scope.activePlans.plans.map(function (r) { return r.id }).indexOf(plan.id); if (planIndex > -1) { this.$scope.inActivePlans.plans.push(plan); @@ -237,8 +261,9 @@ module dockyard.controllers { this.$scope.inActivePlans.plans.splice(planIndex, 1); --this.$scope.inActivePlans.totalPlanCount; } - } - if (this.$scope.activePlans.plans.length == 0 && this.$scope.inActivePlans.plans.length > 0) { + } + + if ((this.$scope.activePlans.plans.length == 0) && this.$scope.inActivePlans.plans.length > 0) { this.$rootScope.$broadcast(<any>designHeaderEvents.PLAN_EXECUTION_STOPPED); } if (this.$scope.inActivePlans.plans.length == 0 && this.$scope.activePlans.plans.length > 0) { @@ -249,6 +274,7 @@ module dockyard.controllers { private deactivatePlan(plan) { this.PlanService.deactivate({ planId: plan.id }).$promise.then((result) => { this.getActivePlans(); + this.getExecutingPlans(); this.getInactivePlans(); }, () => { //deactivation failed @@ -258,19 +284,19 @@ module dockyard.controllers { private updatePlanLastUpdated(id, date) { for (var i = 0; i < this.$scope.activePlans.plans.length; i++) { if (!this.$scope.activePlans.plans[i].id){ - break; + break; } if (this.$scope.activePlans.plans[i].id === id) { this.$scope.activePlans.plans[i].lastUpdated = date; - break; - } - } - } + break; + } + } + } private executePlan(plan, $event) { // If Plan is inactive, activate it in-order to move under Running section - var isInactive = plan.planState === 1; + var isInactive = plan.planState === model.PlanState.Inactive; if (isInactive) { - plan.planState = 2; + plan.planState = model.PlanState.Executing; this.reArrangePlans(plan); } if ($event.ctrlKey) { @@ -284,13 +310,16 @@ module dockyard.controllers { this.PlanService .runAndProcessClientAction(plan.id) .then((data) => { - if (isInactive && data && data.currentPlanType === 1) { + if (isInactive && data && data.currentPlanType == model.PlanType.RunOnce) { // mark plan as Inactive as it is Run Once and then rearrange - plan.planState = 1; + plan.planState = model.PlanState.Inactive; this.reArrangePlans(plan); this.getInactivePlans(); //this.$scope.inActivePlans = this.PlanService.getbystatus({ id: null, status: 1, category: '' }); } + if (data.currentPlanType === model.PlanType.OnGoing) { + plan.planState = model.PlanState.Active; + } }) .catch((failResponse) => { if (failResponse.data.details === "GuestFail") { @@ -298,7 +327,7 @@ module dockyard.controllers { } else { if (isInactive) { // mark plan as Inactive as it is Run Once and then rearrange - plan.planState = 1; + plan.planState = model.PlanState.Inactive; this.reArrangePlans(plan); this.getInactivePlans(); this.goToPlanPage(plan.id); @@ -338,7 +367,6 @@ module dockyard.controllers { break; } } - if (isActive === 2 && self.$scope.activePlans.plans.length < 1) { self.getActivePlans(); } diff --git a/Scripts/app/controllers/SandboxController.ts b/Scripts/app/controllers/SandboxController.ts index 13d153b2f7..60092e1bb6 100644 --- a/Scripts/app/controllers/SandboxController.ts +++ b/Scripts/app/controllers/SandboxController.ts @@ -52,8 +52,7 @@ module dockyard.controllers { 'CriteriaServiceWrapper', 'PlanBuilderService', 'ActionListService', - 'CrateHelper', - 'ActivityTemplateService' + 'CrateHelper' ]; private _scope: ISandboxScope; @@ -71,9 +70,7 @@ module dockyard.controllers { private $timeout: ng.ITimeoutService, private CriteriaServiceWrapper: services.ICriteriaServiceWrapper, private PlanBuilderService: services.IPlanBuilderService, - - private CrateHelper: services.CrateHelper, - private ActivityTemplateService: services.IActivityTemplateService + private CrateHelper: services.CrateHelper ) { this._scope = $scope; this._scope.planId = $state.params.id; diff --git a/Scripts/app/controllers/SolutionDocumentationController.ts b/Scripts/app/controllers/SolutionDocumentationController.ts index ab1a852b5f..51f6a248b4 100644 --- a/Scripts/app/controllers/SolutionDocumentationController.ts +++ b/Scripts/app/controllers/SolutionDocumentationController.ts @@ -33,7 +33,7 @@ module dockyard.controllers { $scope.solutionNameList.forEach( (solutionName: string) => { - var activityTemplate = new model.ActivityTemplate("", solutionName, "", "", ""); + var activityTemplate = new model.ActivityTemplate("", solutionName, "", ""); var activityDTO = new model.ActivityDTO("", "", ""); activityDTO.toActionVM(); diff --git a/Scripts/app/controllers/SolutionListController.ts b/Scripts/app/controllers/SolutionListController.ts index 5dae2d30c8..3f8aef27d1 100644 --- a/Scripts/app/controllers/SolutionListController.ts +++ b/Scripts/app/controllers/SolutionListController.ts @@ -2,27 +2,27 @@ module dockyard.controllers { export interface ISelectActionScope extends ng.IScope { - activityCategories: ng.resource.IResource<interfaces.IActivityCategoryDTO[]>; + activityCategories: interfaces.IActivityCategoryDTO[]; onSolutionSelected: (solution: interfaces.IActivityCategoryDTO) => void; } export class SolutionListController { public static $inject = [ '$scope', - 'ActivityTemplateService', + 'ActivityTemplateHelperService', '$modal', '$state' ]; constructor( private $scope: ISelectActionScope, - private ActivityTemplateService: services.IActivityTemplateService, + private ActivityTemplateHelperService: services.IActivityTemplateHelperService, private ActionService: services.IActionService, private $state: ng.ui.IStateService) { $scope.onSolutionSelected = <(solution: interfaces.IActivityCategoryDTO) => void> angular.bind(this, this.onSolutionSelected); - $scope.activityCategories = ActivityTemplateService.getAvailableActivities(); + $scope.activityCategories = ActivityTemplateHelperService.getAvailableActivityTemplatesInCategories(); } private onSolutionSelected(solution: interfaces.IActivityTemplateVM) { diff --git a/Scripts/app/controllers/TerminalDetailsController.ts b/Scripts/app/controllers/TerminalDetailsController.ts index eefedf5aec..d5ac61f6cb 100644 --- a/Scripts/app/controllers/TerminalDetailsController.ts +++ b/Scripts/app/controllers/TerminalDetailsController.ts @@ -5,9 +5,16 @@ module dockyard.controllers { export interface ITerminalDetailsScope extends ng.IScope { terminal: model.TerminalDTO; + canEditAllTerminals: boolean; + approved: boolean; + participationStateText: string; openPermissionsSetterModal: (terminal: model.TerminalDTO) => void; - submit: (isValid: boolean) => void; + save: ($event: MouseEvent, terminal: model.TerminalDTO) => void; + prodUrlChanged: (terminal: model.TerminalDTO) => void; + showPublishTerminalModal: () => void; + submit: ($event: MouseEvent, isValid: boolean) => void; cancel: () => void; + errorMessage: string; } class TerminalDetailsController { @@ -19,23 +26,112 @@ module dockyard.controllers { '$scope', '$state', '$modal', - 'TerminalService' + 'TerminalService', + 'UserService', + '$mdDialog', + '$http', + 'StringService' ]; constructor( private $scope: ITerminalDetailsScope, private $state: ng.ui.IStateService, private $modal: any, - private TerminalService: services.ITerminalService) { + private TerminalService: services.ITerminalService, + private UserService: services.IUserService, + private $mdDialog: ng.material.IDialogService, + private $http: ng.IHttpService, + private StringService: dockyard.services.IStringService) { - TerminalService.get({ id: $state.params['id'] }).$promise.then(function (data) { - $scope.terminal = data; + TerminalService.get({ id: $state.params['id'] }).$promise.then(function (terminal) { + $scope.terminal = terminal; + $scope.approved = terminal.participationState === enums.ParticipationState.Approved; + $scope.participationStateText = dockyard.enums.ParticipationState[terminal.participationState]; }); + debugger; + // Whether user has terminal administration priviledges, show additional UI elements + $http.get('/api/users/checkpermission', { params: { userId: (<any>window).userId, permissionType: dockyard.enums.PermissionType.EditAllObjects, objectType: 'TerminalDO' } }) + .then(function (resp) { + $scope.canEditAllTerminals = <boolean>resp.data; + }); + + $scope.prodUrlChanged = (terminal: model.TerminalDTO) => { + if (terminal.prodUrl && terminal.prodUrl.length > 0) { + $scope.approved = true; + } + else { + $scope.approved = false; + } + } - $scope.cancel = function () { + $scope.cancel = () => { $state.go('terminals'); }; + $scope.submit = ($event: MouseEvent, isValid: boolean) => { + if (!isValid) { + return; + } + + if (!$scope.terminal.isFr8OwnTerminal && $scope.terminal.devUrl.indexOf('localhost') >= 0) { + let msg: string = ""; + if ($scope.canEditAllTerminals) { + msg += "For non-Fr8 own terminals "; + } + msg += 'Development URL' + this.StringService.terminal["localhost_dev"]; + $scope.errorMessage = msg; + return; + } + + if ($scope.terminal.prodUrl.indexOf('localhost') >= 0) { + $scope.errorMessage = 'Production URL' + this.StringService.terminal["localhost_prod"]; + return; + } + //if (!$scope.canEditAllTerminals) { + // if ($scope.terminal.devUrl.indexOf('localhost') >= 0) { + // let confirmDialog = this.$mdDialog.alert() + // .title('Input error') + // .textContent('Endpoint URL cannot contain the string "localhost".') + // .targetEvent($event) + // .ok('Ok'); + // this.$mdDialog.show(confirmDialog); + // return; + // } + //} + + if ($scope.approved) { + if ($scope.terminal.participationState != enums.ParticipationState.Approved) { + this.showConfigurationDialog($event, "approve", $scope.terminal.name).then(() => { + $scope.terminal.participationState = enums.ParticipationState.Approved; + this.saveTerminal($scope.terminal); + }); + } + else { + this.saveTerminal($scope.terminal); + } + } + else { + if ($scope.terminal.participationState == enums.ParticipationState.Approved) { + this.showConfigurationDialog($event, "recall your approval of", $scope.terminal.name).then(() => { + $scope.terminal.participationState = enums.ParticipationState.Unapproved; + this.saveTerminal($scope.terminal); + }); + } + else { + this.saveTerminal($scope.terminal); + } + } + } + + $scope.showPublishTerminalModal = () => { + $modal.open({ + animation: true, + templateUrl: '/AngularTemplate/TerminalPublishForm', + controller: ['$scope', '$modalInstance', function ($scope, $modalInstance) { + $scope.cancel = () => { $modalInstance.dismiss('cancel'); } + }] + }) + } $scope.openPermissionsSetterModal = (terminal: model.TerminalDTO) => { var modalInstance = $modal.open({ animation: true, @@ -48,12 +144,50 @@ module dockyard.controllers { modalInstance.result.then(function (terminal: model.TerminalDTO) { //TerminalServire.setPermissions(terminal); }); + } } + + private saveTerminal(terminal: model.TerminalDTO) { + let that = this; + this.TerminalService.save(terminal).$promise.then(() => { + this.$state.go('terminals'); + }) + .catch((e) => { + switch (e.status) { + case 400: + that.$scope.errorMessage = that.StringService.terminal["error400"]; + if (e.data.message) { + that.$scope.errorMessage += " Additional information: " + e.data.message; + } + break; + case 404: + that.$scope.errorMessage = that.StringService.terminal["error404"]; + break; + case 409: + that.$scope.errorMessage = that.StringService.terminal["error409"]; + break; + default: + that.$scope.errorMessage = that.StringService.terminal["error"]; + break; + } + }); + } + + private showConfigurationDialog(event: MouseEvent, action: string, terminalName: string) { + // Appending dialog to document.body to cover sidenav in docs app + let confirmDialog = this.$mdDialog.confirm() + .title('Terminal participation state change') + .textContent('Are you sure that you wish to ' + action + ' ' + terminalName + '?') + .targetEvent(event) + .ok('Yes') + .cancel('No'); + return this.$mdDialog.show(confirmDialog); + } } app.controller('TerminalDetailsController', TerminalDetailsController); - app.controller('PermissionsSetterModalController', ['$scope', '$modalInstance','terminal' , ($scope: any, $modalInstance: any, terminal : model.TerminalDTO): void => { + app.controller('PermissionsSetterModalController', ['$scope', '$modalInstance', 'terminal', ($scope: any, $modalInstance: any, terminal: model.TerminalDTO): void => { $scope.terminal = terminal; diff --git a/Scripts/app/directives/ActionPicker.ts b/Scripts/app/directives/ActionPicker.ts index 5ce9a4b842..4d5205e128 100644 --- a/Scripts/app/directives/ActionPicker.ts +++ b/Scripts/app/directives/ActionPicker.ts @@ -4,6 +4,8 @@ module dockyard.directives { 'use strict'; import psa = dockyard.directives.paneSelectAction; + import m = dockyard.model; + import designHeaderEvents = dockyard.Fr8Events.DesignerHeader; export interface IActionPickerScope extends ng.IScope { designerHeaderEl: any, @@ -12,6 +14,7 @@ module dockyard.directives { reload?: () => void }, visible: boolean, + planIsRunning: boolean, onAddActivity: () => void; close: () => void; } @@ -23,10 +26,12 @@ module dockyard.directives { link: (scope: IActionPickerScope, element: any, attr: any) => { var containerEl = $('<div class="action-picker-container action-picker-container-hidden"><action-picker-panel on-close="close()" callback="panelCallback" action-group="group" /></div>'); containerEl.insertAfter($('designer-header')); - scope.designerHeaderEl = $('designer-header'); scope.containerEl = containerEl; - + var planState = attr.planState; + if (planState === model.PlanState.Active || planState === model.PlanState.Executing) { + scope.planIsRunning = true; + } var childScope = scope.$new(false, scope); $compile(containerEl.contents())(childScope); @@ -51,6 +56,16 @@ module dockyard.directives { $scope.containerEl.remove(); }); + $scope.$on(<any>designHeaderEvents.PLAN_EXECUTION_STARTED, + (event: ng.IAngularEvent) => { + $scope.planIsRunning = true; + }); + + $scope.$on(<any>designHeaderEvents.PLAN_EXECUTION_STOPPED, + (event: ng.IAngularEvent) => { + $scope.planIsRunning = false; + }); + $scope.onAddActivity = () => { if ($scope.visible) { return; @@ -97,8 +112,8 @@ module dockyard.directives { return { restrict: 'E', templateUrl: '/AngularTemplate/ActionPickerPanel', - controller: ['$scope', '$http', '$timeout', - ($scope: IActionPickerPanelScope, $http: ng.IHttpService, $timeout: ng.ITimeoutService) => { + controller: ['$scope', 'ActivityTemplateHelperService', '$timeout', + ($scope: IActionPickerPanelScope, ActivityTemplateHelperService: services.IActivityTemplateHelperService, $timeout: ng.ITimeoutService) => { $scope.form = { searchText: '' }; $scope.selectCategory = (category: model.ActivityCategoryDTO) => { @@ -125,9 +140,9 @@ module dockyard.directives { }; var _reload = () => { - $http.get('/api/activity_templates/by_categories') - .then((res: ng.IHttpPromiseCallbackArg<Array<interfaces.IActivityCategoryDTO>>) => { - $scope.categories = res.data.filter((x) => { return x.name !== 'Solution'; }); + ActivityTemplateHelperService.getAvailableActivityTemplatesByCategory() + .then((res: Array<interfaces.IActivityCategoryDTO>) => { + $scope.categories = res; }); }; diff --git a/Scripts/app/directives/ActivityHeader.ts b/Scripts/app/directives/ActivityHeader.ts index a8bdb90a18..06b8f77d95 100644 --- a/Scripts/app/directives/ActivityHeader.ts +++ b/Scripts/app/directives/ActivityHeader.ts @@ -65,7 +65,7 @@ module dockyard.directives.ActivityHeader { window.setTimeout(function () { $scope.$emit('titleLoadingFinished'); }, 500); - }); + }); }]; diff --git a/Scripts/app/directives/ActivityResize.ts b/Scripts/app/directives/ActivityResize.ts index 72c7a52d46..1a0c107c7f 100644 --- a/Scripts/app/directives/ActivityResize.ts +++ b/Scripts/app/directives/ActivityResize.ts @@ -51,17 +51,15 @@ module dockyard.directives { let expectedRatio = titleWrappedWidth / expectedWidth; let fixedFontSize = Math.round(expectedRatio * fontSize); - if (fixedFontSize < 15) { - expectedWidth /= 2; - if (expectedWidth <= titleWrappedWidth) { - fixedFontSize = 20; - } else { - expectedRatio = titleWrappedWidth / expectedWidth; - fixedFontSize = Math.round(expectedRatio * fontSize); - - if (fixedFontSize < 15) - fixedFontSize = 15 - } + expectedWidth /= 2; + if (expectedWidth <= titleWrappedWidth) { + fixedFontSize = 20; + } else if (fixedFontSize < 15) { + expectedRatio = titleWrappedWidth / expectedWidth; + fixedFontSize = Math.round(expectedRatio * fontSize); + + if (fixedFontSize < 15) + fixedFontSize = 15; } cssAttr = { diff --git a/Scripts/app/directives/Controls/ContainerTransition.ts b/Scripts/app/directives/Controls/ContainerTransition.ts index f5b5b18b74..17ab868b1a 100644 --- a/Scripts/app/directives/Controls/ContainerTransition.ts +++ b/Scripts/app/directives/Controls/ContainerTransition.ts @@ -1,6 +1,7 @@ /// <reference path="../../_all.ts" /> module dockyard.directives.containerTransition { import ContainerTransitions = dockyard.model.ContainerTransitions; + import pca = dockyard.directives.paneConfigureAction; import planEvents = dockyard.Fr8Events.Plan; 'use strict'; @@ -16,7 +17,8 @@ module dockyard.directives.containerTransition { currentAction: model.ActivityDTO; removeTransition: (index: number) => void; PCA: directives.paneConfigureAction.IPaneConfigureActionController; - isDisabled:boolean; + isDisabled: boolean; + reconfigure: () => void; } //More detail on creating directives in TypeScript: @@ -34,10 +36,14 @@ module dockyard.directives.containerTransition { <button class="btn btn-default" ng-click="$dismiss()">Okay</button>\ </div>'; - var controller = ['$scope', '$timeout', 'PlanService', '$modal', ($scope: IContainerTransitionScope, $timeout: ng.ITimeoutService, PlanService: services.IPlanService, $modal: any) => { + var controller = ['$scope', '$timeout', 'PlanService', '$modal', 'ActivityTemplateHelperService', ($scope: IContainerTransitionScope, $timeout: ng.ITimeoutService, PlanService: services.IPlanService, $modal: any, ActivityTemplateHelperService: services.IActivityTemplateHelperService) => { var planOptions = new Array<model.DropDownListItem>(); + $scope.reconfigure = () => { + $scope.$emit(pca.MessageType[pca.MessageType.PaneConfigureAction_Reconfigure], new pca.ActionReconfigureEventArgs($scope.currentAction)); + }; + //let's load and keep all plans in cache //TODO think about this - maybe we need to request data from PCA or PB //this direct access will create unnecessary requests to server @@ -142,11 +148,13 @@ module dockyard.directives.containerTransition { var subplanActivities = new Array<model.DropDownListItem>(); for (var i = 0; i < subplan.activities.length; i++) { var current = subplan.activities[i]; - subplanActivities.push(new model.DropDownListItem(current.name, current.id)); + var currentAt = ActivityTemplateHelperService.getActivityTemplate(current); + subplanActivities.push(new model.DropDownListItem(currentAt.label, current.id)); if (!isThisCurrentLevel(subplan.activities[i])) { var childActivityTree = getActivityTree(current); for (var j = 0; j < childActivityTree.length; j++) { - subplanActivities.push(new model.DropDownListItem(childActivityTree[j].name, childActivityTree[j].id)); + var childAT = ActivityTemplateHelperService.getActivityTemplate(childActivityTree[j]); + subplanActivities.push(new model.DropDownListItem(childAT.label, childActivityTree[j].id)); } } } @@ -238,7 +246,9 @@ module dockyard.directives.containerTransition { }; $scope.addTransition = () => { - $scope.field.transitions.push(new model.ContainerTransitionField()); + var newTransition = new model.ContainerTransitionField(); + newTransition.name = "transition_" + $scope.field.transitions.length; + $scope.field.transitions.push(newTransition); }; var buildJumpTargets = (): Array<model.ActivityJumpTarget> => { var targets = new Array<model.ActivityJumpTarget>(); @@ -283,6 +293,7 @@ module dockyard.directives.containerTransition { $scope.onTargetChange = (transition: model.ContainerTransitionField) => { var dd = <model.DropDownList>(<any>transition)._dummySecondaryOperationDD; transition.targetNodeId = dd.value; + transition.errorMessage = null; triggerChange(); if ((<any>transition)._dummyOperationDD.value === ContainerTransitions.JumpToSubplan.toString() @@ -292,15 +303,20 @@ module dockyard.directives.containerTransition { template: warningMessageTemplate }); } - return angular.noop; }; $scope.onOperationChange = (transition: model.ContainerTransitionField) => { var dd = <model.DropDownList>(<any>transition)._dummyOperationDD; + var targetNodeDd = <model.DropDownList>(<any>transition)._dummySecondaryOperationDD; + targetNodeDd.value = null; + targetNodeDd.selectedKey = null; + transition.targetNodeId = null; transition.transition = parseInt(dd.value); + transition.errorMessage = ""; processTransition(transition); triggerChange(); + $scope.reconfigure(); return angular.noop; }; @@ -336,6 +352,9 @@ module dockyard.directives.containerTransition { }; $scope.removeTransition = (index: number) => { $scope.field.transitions.splice(index, 1); + $scope.field.transitions.forEach((tran, index) => { + tran.name = "transition_" + index; + }); triggerChange(); }; @@ -360,7 +379,8 @@ module dockyard.directives.containerTransition { subPlan: '=', field: '=', currentAction: '=', - isDisabled: '=' + isDisabled: '=', + change: '&' } }; } diff --git a/Scripts/app/directives/Controls/Fr8Event.ts b/Scripts/app/directives/Controls/Fr8Event.ts index d0d462b54c..a8b70d0bc7 100644 --- a/Scripts/app/directives/Controls/Fr8Event.ts +++ b/Scripts/app/directives/Controls/Fr8Event.ts @@ -1,7 +1,7 @@ /// <reference path="../../_all.ts" /> module dockyard.directives { 'use strict'; - + import designHeaderEvents = dockyard.Fr8Events.DesignerHeader; export interface IFr8EventScope extends ng.IScope { color: string; event: any; @@ -16,6 +16,10 @@ module dockyard.directives { export function Fr8Event(): ng.IDirective { var controller = ['$scope', ($scope: IFr8EventScope) => { + // Declared common values for all notification types + $scope.eventHeader = $scope.event.Subject + $scope.eventSubHeader = null; + $scope.eventMessage = $scope.event.Message; // Checks whether notification will be shown open or not $scope.isCollapsed = true; if ($scope.event.Collapsed != null) { @@ -29,40 +33,29 @@ module dockyard.directives { // Determines notification type and add necessary attributes switch ($scope.type) { case dockyard.enums.NotificationType.GenericSuccess: - $scope.eventHeader = $scope.event.Subject ? $scope.event.Subject : 'Success'; - $scope.eventSubHeader = null; - $scope.eventMessage = $scope.event.Message; $scope.color = 'green'; $scope.icon = 'fa-check'; break; case dockyard.enums.NotificationType.GenericFailure: - $scope.eventHeader = 'Plan Failed'; - $scope.eventSubHeader = null; - $scope.eventMessage = $scope.event.Message; $scope.color = 'red'; $scope.icon = 'fa-times'; + $scope.$emit(<any>designHeaderEvents.PLAN_EXECUTION_FAILED); break; case dockyard.enums.NotificationType.GenericInfo: - $scope.eventHeader = 'Executing Activity'; $scope.eventSubHeader = $scope.event.ActivityName; - $scope.eventMessage = $scope.event.Message; $scope.icon = 'fa-cogs'; break; case dockyard.enums.NotificationType.TerminalEvent: - if ($scope.event.Subject) { - $scope.eventHeader = $scope.event.Subject; - } else { + if (!$scope.event.Subject) { $scope.eventHeader = $scope.event.TerminalName + '-v' + $scope.event.TerminalVersion; $scope.eventSubHeader = $scope.event.ActivityName + '-v' + $scope.event.ActivityVersion; } - $scope.eventMessage = $scope.event.Message; $scope.icon = 'fa-bolt'; break; case dockyard.enums.NotificationType.ExecutionStopped: - $scope.eventHeader = 'Plan Stopped'; - $scope.eventMessage = $scope.event.Message + ' has been stopped.'; $scope.color = 'firebrick'; $scope.icon = 'fa-stop'; + break; } }]; diff --git a/Scripts/app/directives/DesignerHeader/DesignerHeader.ts b/Scripts/app/directives/DesignerHeader/DesignerHeader.ts index 1fe2872f30..b970ec8ba8 100644 --- a/Scripts/app/directives/DesignerHeader/DesignerHeader.ts +++ b/Scripts/app/directives/DesignerHeader/DesignerHeader.ts @@ -35,14 +35,16 @@ module dockyard.directives.designerHeader { $scope.$watch('plan.planState', function (newValue, oldValue) { switch (newValue) { - case 1: + case model.PlanState.Inactive: // emit evet to control liner-progress bar $rootScope.$broadcast(<any>designHeaderEvents.PLAN_EXECUTION_STOPPED); break; - case 2: + case model.PlanState.Executing: // emit evet to control liner-progress bar $rootScope.$broadcast(<any>designHeaderEvents.PLAN_EXECUTION_STARTED); break; + case model.PlanState.Active: + break; default: // emit evet to control liner-progress bar $rootScope.$broadcast(<any>designHeaderEvents.PLAN_EXECUTION_STOPPED); @@ -51,26 +53,34 @@ module dockyard.directives.designerHeader { }); $scope.editTitle = () => { - $scope.editing = true; + if (!$scope.editing) { + $scope.editing = !$scope.editing; + } }; $scope.onTitleChange = () => { - $scope.editing = false; + if ($scope.editing) { + $scope.editing = !$scope.editing; + } + var result = PlanService.update({ id: $scope.plan.id, name: $scope.plan.name, description: null }); result.$promise.then(() => { }); }; $scope.runPlan = () => { // mark plan as Active - $scope.plan.planState = 2; + $scope.plan.planState = model.PlanState.Executing; var promise = PlanService.runAndProcessClientAction($scope.plan.id); promise.then((container: model.ContainerDTO) => { //if we have validation errors - reset plan state to Inactive. Plans with errors can't be activated + if (container.currentPlanType === model.PlanType.OnGoing) { + $scope.plan.planState = model.PlanState.Active; + } if (container.validationErrors && container.validationErrors != null) { for (var key in container.validationErrors) { if (container.validationErrors.hasOwnProperty(key)) { - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; break; } } @@ -97,34 +107,34 @@ module dockyard.directives.designerHeader { var initialActivity: interfaces.IActivityDTO = subPlan ? subPlan.activities[0] : null; if (initialActivity == null) { // mark plan as Inactive - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; return; } var at = ActivityTemplateHelperService.getActivityTemplate(<model.ActivityDTO>initialActivity); - if (at.category.toLowerCase() === "solution") { + if (at.categories.some((value) => { return value.name.toLowerCase() === "solution"; })) { initialActivity = initialActivity.childrenActivities[0]; if (initialActivity == null) { // mark plan as Inactive - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; return; } } - if (at.category.toLowerCase() !== "monitors") { + if (!at.categories.some((value) => { return value.name.toLowerCase() === "monitors"; })) { // mark plan as Inactive - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; } }; $scope.$on(<any>designHeaderEvents.PLAN_IS_DEACTIVATED, - (event: ng.IAngularEvent, eventArgs: model.PlanDTO) => { $scope.plan.planState = 1;}); + (event: ng.IAngularEvent, eventArgs: model.PlanDTO) => { $scope.plan.planState = model.PlanState.Inactive;}); $scope.deactivatePlan = () => { var result = PlanService.deactivate({ planId: $scope.plan.id }); result.$promise.then((data) => { // mark plan as inactive - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; var messageToShow = "Plan successfully deactivated"; ngToast.success(messageToShow); }) diff --git a/Scripts/app/directives/PaneConfigureAction/PaneConfigureAction.ts b/Scripts/app/directives/PaneConfigureAction/PaneConfigureAction.ts index 20941377a7..43a997ff4a 100644 --- a/Scripts/app/directives/PaneConfigureAction/PaneConfigureAction.ts +++ b/Scripts/app/directives/PaneConfigureAction/PaneConfigureAction.ts @@ -184,13 +184,13 @@ module dockyard.directives.paneConfigureAction { export class PaneConfigureActionController implements IPaneConfigureActionController { - static $inject = ['$scope', 'ActionService', 'AuthService', 'ConfigureTrackerService', 'CrateHelper', '$filter', + static $inject = ['$scope', 'ActivityService', 'AuthService', 'ConfigureTrackerService', 'CrateHelper', '$filter', '$timeout', '$modal', '$window', '$http', '$q', 'LayoutService', 'ActivityTemplateHelperService']; private configLoadingError: boolean = false; private ignoreConfigurationChange: boolean = false; - constructor(private $scope: IPaneConfigureActionScope, private ActionService: services.IActionService, + constructor(private $scope: IPaneConfigureActionScope, private ActivityService: services.IActivityService, private AuthService: services.AuthService, private ConfigureTrackerService: services.ConfigureTrackerService, private crateHelper: services.CrateHelper, private $filter: ng.IFilterService, private $timeout: ng.ITimeoutService, private $modal, @@ -368,8 +368,7 @@ module dockyard.directives.paneConfigureAction { this.$scope.currentAction.crateStorage.crateDTO = this.$scope.currentAction.crateStorage.crates; //backend expects crates on CrateDTO field - this.ActionService.save({ id: this.$scope.currentAction.id }, this.$scope.currentAction, null, null) - .$promise + this.ActivityService.save(this.$scope.currentAction) .then(() => { if (this.$scope.currentAction.childrenActivities @@ -383,13 +382,13 @@ module dockyard.directives.paneConfigureAction { // save request will stop running plans, so FE should know that // commented out because of FR-4352, now running plan locks activities configuration - //if (this.$scope.plan.planState === 2) { - // this.$scope.plan.planState = 1; + //if (this.$scope.plan.planState === model.PlanState.Executing) { + // this.$scope.plan.planState = model.PlanState.Inactive; //} // the save request is sent, so we can run the plan - if (this.$scope.plan.planState === 3) { - this.$scope.plan.planState = 1; + if (this.$scope.plan.planState === model.PlanState.Saving_Changes) { + this.$scope.plan.planState = model.PlanState.Inactive; } } @@ -502,7 +501,7 @@ module dockyard.directives.paneConfigureAction { this.$scope.$broadcast(MessageType[MessageType.PaneConfigureAction_ConfigureStarting]); - this.ActionService.configure(this.$scope.currentAction).$promise + this.ActivityService.configure(this.$scope.currentAction) .then((res: interfaces.IActionVM) => { //lets reset config control handles //they will re register themselves after initializing @@ -543,7 +542,7 @@ module dockyard.directives.paneConfigureAction { //in case of reconfiguring the solution check the child actions again //not needed in case of Loop action - if (this.$scope.currentAction.name !== "Loop") { + if (this.$scope.currentAction.activityTemplate.name !== "Loop") { this.$scope.$emit(MessageType[MessageType.PaneConfigureAction_ChildActionsDetected]); } } @@ -648,7 +647,7 @@ module dockyard.directives.paneConfigureAction { } this.$timeout.cancel(this.timeoutPromise); //does nothing, if timeout alrdy done - this.$scope.plan.planState = 3; // a control value is changed, the plan should not be run after the change request is sent to server + this.$scope.plan.planState = model.PlanState.Saving_Changes; // a control value is changed, the plan should not be run after the change request is sent to server this.timeoutPromise = this.$timeout(() => { //Set timeout to prevent sending more than one save requests for changes lasts less than 1 sec. this.$scope.onConfigurationChanged(newValue, oldValue); }, 1000); diff --git a/Scripts/app/directives/PaneSelectAction/PaneSelectAction.ts b/Scripts/app/directives/PaneSelectAction/PaneSelectAction.ts index fd342b8688..40a4dce4f7 100644 --- a/Scripts/app/directives/PaneSelectAction/PaneSelectAction.ts +++ b/Scripts/app/directives/PaneSelectAction/PaneSelectAction.ts @@ -110,7 +110,7 @@ module dockyard.directives.paneSelectAction { private _$element: ng.IAugmentedJQuery; private _$scope: IPaneSelectActionScope; - constructor(private $modal: any, private ActivityTemplateService: services.IActivityTemplateService) { + constructor(private $modal: any) { PaneSelectAction.prototype.link = ( scope: IPaneSelectActionScope, element: ng.IAugmentedJQuery, @@ -176,11 +176,11 @@ module dockyard.directives.paneSelectAction { //The factory function returns Directive object as per Angular requirements public static Factory() { - var directive = ($modal: any, ActivityTemplateService : services.IActivityTemplateService) => { - return new PaneSelectAction($modal, ActivityTemplateService); + var directive = ($modal: any) => { + return new PaneSelectAction($modal); }; - directive['$inject'] = ['$modal', 'ActivityTemplateService']; + directive['$inject'] = ['$modal']; return directive; } } diff --git a/Scripts/app/directives/UIBlocker.ts b/Scripts/app/directives/UIBlocker.ts index fc134a6a8e..8703043d30 100644 --- a/Scripts/app/directives/UIBlocker.ts +++ b/Scripts/app/directives/UIBlocker.ts @@ -14,21 +14,27 @@ module dockyard.directives.UIBlocker { var controller = ['$scope', '$rootScope', 'UIHelperService', 'PlanService', ($scope: IUIBlockerScope, $rootScope: interfaces.IAppRootScope, UIHelperService: services.IUIHelperService, PlanService: services.IPlanService) => { var alertMessage = new model.AlertDTO(); alertMessage.title = "Plan is disabled"; - alertMessage.body = "You can't modify this Plan while it's running. Would you like to stop it now?"; alertMessage.isOkCancelVisible = true; $scope.showPlanIsDisabledDialog = () => { - UIHelperService - .openConfirmationModal(alertMessage) - .then(() => { - $scope.deactivatePlan(); - }); + if ($scope.plan.planState === model.PlanState.Active) { + alertMessage.body = "You can't modify this Plan while it's running. Would you like to stop it now?" + UIHelperService + .openConfirmationModal(alertMessage) + .then(() => { + $scope.deactivatePlan(); + }); + } + else { + alertMessage.body = "You can't modify this Plan while it's running." + UIHelperService.openConfirmationModal(alertMessage); + } } $scope.deactivatePlan = () => { var result = PlanService.deactivate({ planId: $scope.plan.id }); result.$promise.then((data) => { - $scope.plan.planState = 1; + $scope.plan.planState = model.PlanState.Inactive; $rootScope.$broadcast(<any>designHeaderEvents.PLAN_IS_DEACTIVATED); }); }; diff --git a/Scripts/app/directives/directives.ts b/Scripts/app/directives/directives.ts index 201a96b9b1..52c5b0a6b2 100644 --- a/Scripts/app/directives/directives.ts +++ b/Scripts/app/directives/directives.ts @@ -407,3 +407,36 @@ app.directive('pbScrollPane', ['$timeout', '$window', function ($timeout, $windo } }; }]); + +//== scroll grey area of PB vertically and horizontally +app.directive('activityFullHeight', ['$timeout', '$window', function ($timeout, $window) { + return { + restrict: 'A', + link: function (scope: ng.IScope, element) { + + angular.element(window).bind('resize', function () { + setHeight(); + }); + + scope.$on('onKioskModalLoad', function () { + $timeout(setHeight, 500); + }); + + function setHeight() { + var winH = $(window).height(); + var winW = $(window).width(); + var wrapH = winH - 60; + + if (winW <= 400) { + $(element).height(wrapH); + $(element).find('.page-container').height(wrapH); + $(element).find('.route-builder-container').height(wrapH); + $(element).find('.action').height(wrapH); + $(element).find('.action').css('margin-bottom', '0px'); + $(element).find('.ng-scope').css('margin-top', '0px'); + $(element).find('.page-content').css('padding-bottom', '0px'); + } + } + } + }; +}]); diff --git a/Scripts/app/directives/layout.ts b/Scripts/app/directives/layout.ts index 1169519cb7..392e4a79a7 100644 --- a/Scripts/app/directives/layout.ts +++ b/Scripts/app/directives/layout.ts @@ -36,7 +36,9 @@ module dockyard.directives { } return 0; }, (newValue) => { - elem.css('height', newValue); + var w = $(window).width(); + if( w > 400) + elem.css('height', newValue); }); } }; diff --git a/Scripts/app/enums/ParticipationState.ts b/Scripts/app/enums/ParticipationState.ts new file mode 100644 index 0000000000..473e3f845e --- /dev/null +++ b/Scripts/app/enums/ParticipationState.ts @@ -0,0 +1,9 @@ +module dockyard.enums { + // If you add, change or remove items, please do the same in ParticipationState. + export enum ParticipationState { + Unapproved = 0, + Approved = 1, + Blocked = 2, + Deleted = 3 + }; +} diff --git a/Scripts/app/enums/PermissionType.ts b/Scripts/app/enums/PermissionType.ts new file mode 100644 index 0000000000..9a119ba5ed --- /dev/null +++ b/Scripts/app/enums/PermissionType.ts @@ -0,0 +1,16 @@ +module dockyard.enums { + // Don't forget to add corresponding items to PermissionType.cs + export enum PermissionType { + CreateObject = 1, + ReadObject = 2, + EditObject = 3, + DeleteObject = 4, + RunObject = 5, + ViewAllObjects = 6, + EditAllObjects = 7, + ManageFr8Users = 8, + ManageInternalUsers = 9, + EditPageDefinitions = 10, + UseTerminal = 11 + }; +} diff --git a/Scripts/app/filters/PlanState.ts b/Scripts/app/filters/PlanState.ts index 12e8190410..e4d5396460 100644 --- a/Scripts/app/filters/PlanState.ts +++ b/Scripts/app/filters/PlanState.ts @@ -6,13 +6,15 @@ module dockyard { 'use strict'; app.filter('PlanState', () => - (input : number): string => { + (input : string): string => { switch (input) { - case model.PlanState.Running: - return "Running"; + case model.PlanState.Executing: + return "Executing"; case model.PlanState.Inactive: return "Inactive"; + case model.PlanState.Active: + return "Active"; default: return "Inactive"; } diff --git a/Scripts/app/interfaces/ICriteria.ts b/Scripts/app/interfaces/ICriteria.ts index 4655f4de7f..ca24cc2c68 100644 --- a/Scripts/app/interfaces/ICriteria.ts +++ b/Scripts/app/interfaces/ICriteria.ts @@ -28,6 +28,7 @@ module dockyard.interfaces { } export interface IActivityCategoryDTO { + id: string; name: string; activities: Array<IActivityTemplateVM>; } diff --git a/Scripts/app/model/ActionDTO.ts b/Scripts/app/model/ActionDTO.ts index 5c59ad3dfb..75a2c48dc9 100644 --- a/Scripts/app/model/ActionDTO.ts +++ b/Scripts/app/model/ActionDTO.ts @@ -4,12 +4,10 @@ parentPlanNodeId: string; id: string; label: string; - name: string; authTokenId: string; crateStorage: model.CrateStorage; configurationControls: model.ControlsList; activityTemplate: ActivityTemplateSummary; - currentView: string; childrenActivities: Array<interfaces.IActivityDTO>; height: number = 300; ordering: number; @@ -53,7 +51,6 @@ result.configurationControls = dataObject.configurationControls; result.id = dataObject.id; result.label = dataObject.label; - result.name = dataObject.name; result.parentPlanNodeId = dataObject.parentPlanNodeId; result.ordering = dataObject.ordering; return result; diff --git a/Scripts/app/model/ActivityCategoryDTO.ts b/Scripts/app/model/ActivityCategoryDTO.ts index a43be36888..2111076a49 100644 --- a/Scripts/app/model/ActivityCategoryDTO.ts +++ b/Scripts/app/model/ActivityCategoryDTO.ts @@ -1,5 +1,23 @@ module dockyard.model { + export class ActivityCategories { + public static monitorId: string = '417DD061-27A1-4DEC-AECD-4F468013FD24'; + public static receiveId: string = '29EFB1D7-A9EA-41C5-AC60-AEF1F520E814'; + public static processId: string = '69FB6D2C-2083-4696-9457-B7B152D358C2'; + public static forwardId: string = 'AFD7E981-A21A-4B05-B0B1-3115A5448F22'; + public static solutionId: string = 'F9DF2AC2-2F10-4D21-B97A-987D46AD65B0'; + + public static isPredefinedCategory(id: string): boolean { + var idUpper = id.toUpperCase(); + return (ActivityCategories.monitorId === idUpper) + || (ActivityCategories.receiveId === idUpper) + || (ActivityCategories.processId === idUpper) + || (ActivityCategories.forwardId === idUpper) + || (ActivityCategories.solutionId === idUpper); + } + } + export class ActivityCategoryDTO implements interfaces.IActivityCategoryDTO { + id: string; name: string; iconPath: string; activities: Array<interfaces.IActivityTemplateVM>; diff --git a/Scripts/app/model/ActivityTemplate.ts b/Scripts/app/model/ActivityTemplate.ts index 0419870745..dac26a3a25 100644 --- a/Scripts/app/model/ActivityTemplate.ts +++ b/Scripts/app/model/ActivityTemplate.ts @@ -13,33 +13,45 @@ label: string; version: string; defaultEndPoint: string; - category: string; + // TODO: FR-4943, remove this. + // category: string; type: string; tags: string; minPaneWidth: number; terminal: TerminalDTO; needsAuthentication: boolean; - webService: WebServiceDTO; - showDocumentation : ActivityResponseDTO; + // TODO: FR-4943, remove this. + // webService: WebServiceDTO; + categories: Array<ActivityCategoryDTO>; + showDocumentation: ActivityResponseDTO; + description: string; constructor( id: string, name: string, version: string, - category: string, + // TODO: FR-4943, remove this. + // category: string, label?: string, minPaneWidth?: number, type?: string, - webService?: WebServiceDTO, - showDocumentation? : ActivityResponseDTO) { + // TODO: FR-4943, remove this. + // webService?: WebServiceDTO, + categories?: Array<ActivityCategoryDTO>, + showDocumentation?: ActivityResponseDTO, + description?: string) { this.id = id; this.name = name; this.label = label; this.version = version; - this.category = category; + // TODO: FR-4943, remove this. + // this.category = category; this.type = type; - this.webService = webService; + // TODO: FR-4943, remove this. + // this.webService = webService; + this.categories = categories; this.showDocumentation = showDocumentation; + this.description = description; //this.parentPluginRegistration = parentPluginRegistration; the client shouldn't know anything about plugins } @@ -49,11 +61,15 @@ this.name, this.label, this.version, - this.category, + // TODO: FR-4943, remove this. + // this.category, this.minPaneWidth, this.type, - this.webService, - this.showDocumentation + // TODO: FR-4943, remove this. + // this.webService, + this.categories, + this.showDocumentation, + this.description // this.parentPluginRegistration ); diff --git a/Scripts/app/model/ControlsList.ts b/Scripts/app/model/ControlsList.ts index d38b36330f..43b35ece7c 100644 --- a/Scripts/app/model/ControlsList.ts +++ b/Scripts/app/model/ControlsList.ts @@ -7,7 +7,12 @@ controls: Array<ControlDefinitionDTO>; } - export class ControlDefinitionDTO { + export interface ISupportsErrorMessage { + name: string; + errorMessage: string; + } + + export class ControlDefinitionDTO implements ISupportsErrorMessage { type: string; fieldLabel: string; label: string; @@ -224,10 +229,12 @@ metaDescriptions: Array<ControlMetaDescriptionDTO>; } - export class ContainerTransitionField { + export class ContainerTransitionField implements ISupportsErrorMessage { conditions: Array<FilterConditionDTO>; transition: number; targetNodeId: string; + name: string; + errorMessage: string; constructor() { this.conditions = []; diff --git a/Scripts/app/model/Plan.ts b/Scripts/app/model/Plan.ts index 751ba7d624..c21597d85e 100644 --- a/Scripts/app/model/Plan.ts +++ b/Scripts/app/model/Plan.ts @@ -6,7 +6,7 @@ tag: string; lastUpdated: string; description: string; - planState: PlanState; + planState: string; subscribedDocuSignTemplates: Array<string>; externalEventSubscription: Array<number>; startingSubPlanId: number; @@ -15,10 +15,11 @@ category: string; } - export enum PlanState { - Inactive = 1, - Running = 2, - Saving_Changes = 3 + export class PlanState { + static Inactive = "Inactive"; + static Executing = "Executing"; + static Saving_Changes = "Saving_Changes"; + static Active = "Active"; } export enum PlanVisibility { @@ -34,7 +35,7 @@ id: string; page: number; planPerPage: number; - status:number; + status:string; category: string; orderBy: string; isDescending: boolean; diff --git a/Scripts/app/model/TerminalDTO.ts b/Scripts/app/model/TerminalDTO.ts index 289cef0ed1..7641efa139 100644 --- a/Scripts/app/model/TerminalDTO.ts +++ b/Scripts/app/model/TerminalDTO.ts @@ -4,9 +4,13 @@ name: string; label: string; endpoint: string; + prodUrl: string; + devUrl: string; description: string; version: string; terminalStatus: number; + isFr8OwnTerminal: boolean; + participationState: enums.ParticipationState; authenticationType: number; roles: Array<string>; diff --git a/Scripts/app/services/ActivityService.ts b/Scripts/app/services/ActivityService.ts new file mode 100644 index 0000000000..dd4d34eb5a --- /dev/null +++ b/Scripts/app/services/ActivityService.ts @@ -0,0 +1,86 @@ +/// <reference path="../_all.ts" /> + +module dockyard.services { + + export interface IActivityService { + save: (activity: interfaces.IActivityDTO) => ng.IPromise<interfaces.IActivityDTO>; + configure: (activity: interfaces.IActivityDTO) => ng.IPromise<interfaces.IActivityDTO>; + } + + interface IActivityFunction { + (activityDTO: interfaces.IActivityDTO): ng.IPromise<interfaces.IActivityDTO>; + } + + class ActivityRequestQueue { + constructor(deferred: ng.IDeferred<interfaces.IActivityDTO>, opFunction: IActivityFunction, activityDTO: interfaces.IActivityDTO) { + this.deferred = deferred; + this.opFunction = opFunction; + this.activityDTO = activityDTO; + } + public deferred: ng.IDeferred<interfaces.IActivityDTO>; + public opFunction: IActivityFunction; + public activityDTO: interfaces.IActivityDTO; + } + + ///This service queues request for same activity + //therefore no concurrent request of the same activity can be made + class ActivityService implements IActivityService { + + private activityRequestMap: { [id: string]: Array<ActivityRequestQueue>; } = {}; + + constructor(private $http: ng.IHttpService, private $q: ng.IQService) { + + } + + private processNext(id: string) { + //end of queue + if (this.activityRequestMap[id].length === 0) { + return; + } + var queueElement = this.activityRequestMap[id][0]; + var operationPromise = <ng.IPromise<interfaces.IActivityDTO>>queueElement.opFunction.call(this, queueElement.activityDTO); + operationPromise.then((activityDTO: interfaces.IActivityDTO) => { + queueElement.deferred.resolve(activityDTO); + }, (err) => { + queueElement.deferred.reject(err); + }).finally(() => { + //remove processed element from queue + this.activityRequestMap[id].shift(); + this.processNext(id); + }); + } + + private queueRequest(opFunction: IActivityFunction, activityDTO: interfaces.IActivityDTO): ng.IPromise<interfaces.IActivityDTO> { + var deferred = this.$q.defer<interfaces.IActivityDTO>(); + + if (!this.activityRequestMap[activityDTO.id]) { + this.activityRequestMap[activityDTO.id] = []; + } + //push this operation to queue + this.activityRequestMap[activityDTO.id].push(new ActivityRequestQueue(deferred, opFunction, activityDTO)); + //process this immediately + if (this.activityRequestMap[activityDTO.id].length === 1) { + this.processNext(activityDTO.id); + } + return deferred.promise; + } + + private saveInternal(activityDTO: interfaces.IActivityDTO): ng.IPromise<interfaces.IActivityDTO> { + return this.$http.post('/api/activities/save', activityDTO).then((resp) => resp.data); + } + + private configureInternal(activityDTO: interfaces.IActivityDTO): ng.IPromise<interfaces.IActivityDTO> { + return this.$http.post('/api/activities/configure', activityDTO).then((resp) => resp.data); + } + + public save(activityDTO: model.ActivityDTO): ng.IPromise<interfaces.IActivityDTO> { + return this.queueRequest(this.saveInternal, activityDTO); + } + + public configure(activityDTO: model.ActivityDTO): ng.IPromise<interfaces.IActivityDTO> { + return this.queueRequest(this.configureInternal, activityDTO); + } + } + + app.factory('ActivityService', ['$http', '$q', ($http: ng.IHttpService, $q: ng.IQService): IActivityService => new ActivityService($http, $q)]); +} \ No newline at end of file diff --git a/Scripts/app/services/ActivityTemplateService.ts b/Scripts/app/services/ActivityTemplateService.ts index 478296a1de..d72c8ca5a0 100644 --- a/Scripts/app/services/ActivityTemplateService.ts +++ b/Scripts/app/services/ActivityTemplateService.ts @@ -5,6 +5,8 @@ module dockyard.services { export interface IActivityTemplateService extends ng.resource.IResourceClass<interfaces.IActivityTemplateVM> { getAvailableActivities: () => ng.resource.IResource<Array<interfaces.IActivityCategoryDTO>>; + //TODO inspect this - why do we have 2 different methods returning different responses by similar names? + getAvailableActivitiesByCategory: () => ng.resource.IResource<Array<interfaces.IActivityCategoryDTO>>; } app.factory('ActivityTemplateService', ['$resource', ($resource: ng.resource.IResourceService): IActivityTemplateService => @@ -14,11 +16,18 @@ module dockyard.services { method: 'GET', url: '/api/activity_templates', isArray: true + }, + 'getAvailableActivitiesByCategory': { + method: 'GET', + url: '/api/activity_templates/by_categories', + isArray: true } }) ]); export interface IActivityTemplateHelperService { + getAvailableActivityTemplatesByCategory: () => ng.IPromise<Array<interfaces.IActivityCategoryDTO>>; + getAvailableActivityTemplatesInCategories: () => Array<interfaces.IActivityCategoryDTO>; getActivityTemplate: (activity: interfaces.IActivityDTO) => interfaces.IActivityTemplateVM; toSummary: (activityTemplate: interfaces.IActivityTemplateVM) => model.ActivityTemplateSummary; equals: (activityTemplateSummary: model.ActivityTemplateSummary, activityTemplate: interfaces.IActivityTemplateVM) => boolean; @@ -27,8 +36,9 @@ module dockyard.services { class ActivityTemplateHelperService implements IActivityTemplateHelperService { private activityTemplateCache: Array<interfaces.IActivityTemplateVM> = []; + private activityTemplateByCategoryCache: Array<interfaces.IActivityCategoryDTO> = null; - constructor(private ActivityTemplates: Array<interfaces.IActivityCategoryDTO>) { + constructor(private ActivityTemplates: Array<interfaces.IActivityCategoryDTO>, private $q: ng.IQService, private activityTemplateService: IActivityTemplateService) { //lineralize data for (var i = 0; i < this.ActivityTemplates.length; i++) { for (var j = 0; j < this.ActivityTemplates[i].activities.length; j++){ @@ -66,44 +76,27 @@ module dockyard.services { } return false; } - - - //private loadActivities() { - - // this.ActivityTemplateService.getAvailableActivities().$promise.then((data: Array<interfaces.IActivityCategoryDTO>) => { - // var list = []; - // for (var i = 0; i < data.length; i++) { - // list.push(data[i].activities); - // } - // this.activityTemplateCache = list; - // for (var i = 0; i < this.waiters.length; i++) { - // this.waiters[i].resolve(this.activityTemplateCache); - // } - // }, () => { - // for (var i = 0; i < this.waiters.length; i++) { - // this.waiters[i].reject(); - // } - // }); - //} - - - - //public getActivities(): ng.IPromise<Array<interfaces.IActivityTemplateVM>> { - // var deferred = this.$q.defer<Array<interfaces.IActivityTemplateVM>>(); - - // if (this.activityTemplateCache === null) { - // this.waiters.push(deferred); - // //this is initial call - we should load templates - // if(this.waiters.length === 1){ - // this.loadActivities(); - // } - // } else { - // deferred.resolve(this.activityTemplateCache); - // } - // return deferred.promise; - //} + + public getAvailableActivityTemplatesInCategories() { + return this.ActivityTemplates; + } + + public getAvailableActivityTemplatesByCategory() { + var deferred = this.$q.defer<Array<interfaces.IActivityCategoryDTO>>(); + if (this.activityTemplateByCategoryCache != null) { + deferred.resolve(this.activityTemplateByCategoryCache); + } else { + this.activityTemplateService.getAvailableActivitiesByCategory().$promise.then((data) => { + this.activityTemplateByCategoryCache = data; + deferred.resolve(data); + }, (err) => { + deferred.reject(err); + }); + } + return deferred.promise; + } } - app.factory('ActivityTemplateHelperService', ['ActivityTemplates', (ActivityTemplates: Array<interfaces.IActivityCategoryDTO>): IActivityTemplateHelperService => new ActivityTemplateHelperService(ActivityTemplates)]); + app.factory('ActivityTemplateHelperService', ['ActivityTemplates', '$q', 'ActivityTemplateService', (ActivityTemplates: Array<interfaces.IActivityCategoryDTO>, $q: ng.IQService, ActivityTemplateService: IActivityTemplateService): IActivityTemplateHelperService => new ActivityTemplateHelperService(ActivityTemplates, $q, ActivityTemplateService)]); } \ No newline at end of file diff --git a/Scripts/app/services/AuthService.ts b/Scripts/app/services/AuthService.ts index af05b49879..6d1c497bc9 100644 --- a/Scripts/app/services/AuthService.ts +++ b/Scripts/app/services/AuthService.ts @@ -82,7 +82,7 @@ return false; } var at = this.ActivityTemplateHelperService.getActivityTemplate(activity); - if (at.category === 'Solution' + if (at.categories.some((value, index, arr) => { return value.name && value.name.toLowerCase() === 'Solution'; }) // Second clause to force new algorithm work only for specific activities. && at.tags === 'UsesReconfigureList') { diff --git a/Scripts/app/services/CrateHelper.ts b/Scripts/app/services/CrateHelper.ts index 0e6c13e890..c0e0e1606a 100644 --- a/Scripts/app/services/CrateHelper.ts +++ b/Scripts/app/services/CrateHelper.ts @@ -196,7 +196,7 @@ } } - private setFieldValidationErrors(field: model.ControlDefinitionDTO, validationResults: model.ValidationResults) { + private setFieldValidationErrors(field: model.ISupportsErrorMessage, validationResults: model.ValidationResults) { for (var j = 0; j < validationResults.validationErrors.length; j++) { if (validationResults.validationErrors[j].controlNames == null) { continue; @@ -210,7 +210,7 @@ } } - public resetValidationErrors(fields: Array<model.ControlDefinitionDTO>) { + public resetValidationErrors(fields: Array<model.ISupportsErrorMessage>) { for (var i = 0; i < fields.length; i++) { fields[i].errorMessage = null; @@ -223,10 +223,14 @@ if (field.radios) { this.resetValidationErrors((<model.RadioButtonGroup>field).radios); } + //If we have ContainerTransitions we check every individual transition + if (field.transitions) { + this.resetValidationErrors((<model.ContainerTransition>field).transitions); + } } } - public setValidationErrors(fields: Array<model.ControlDefinitionDTO>, validationResults: model.ValidationResults) { + public setValidationErrors(fields: Array<model.ISupportsErrorMessage>, validationResults: model.ValidationResults) { for (var i = 0; i < fields.length; i++) { fields[i].errorMessage = null; @@ -241,6 +245,10 @@ if (field.radios) { this.setValidationErrors((<model.RadioButtonGroup>field).radios, validationResults); } + //If we have ContainerTransitions we check every individual transition + if (field.transitions) { + this.setValidationErrors((<model.ContainerTransition>field).transitions, validationResults); + } } } diff --git a/Scripts/app/services/PlanBuilderService.ts b/Scripts/app/services/PlanBuilderService.ts index 6e3c1872cc..361076120d 100644 --- a/Scripts/app/services/PlanBuilderService.ts +++ b/Scripts/app/services/PlanBuilderService.ts @@ -313,21 +313,6 @@ module dockyard.services { } }) ]); - - app.factory('ActionTemplateService', ['$resource', ($resource: ng.resource.IResourceService): IActionService => - <IActionService>$resource('/api/activity_templates/', null, - { - 'available': { - method: 'GET', - isArray: true, - url: '/api/activity_templates?tag=:tag', - params: { - tag: '@tag' - } - } - }) - ]); - /* ActivityDTO CRUD service. diff --git a/Scripts/app/services/StringService.ts b/Scripts/app/services/StringService.ts index aaf3ef50fe..b1f6b599e6 100644 --- a/Scripts/app/services/StringService.ts +++ b/Scripts/app/services/StringService.ts @@ -6,7 +6,7 @@ module dockyard.services { export interface IStringService { - plan: dictionary; + terminal: dictionary; } export interface dictionary { @@ -14,10 +14,13 @@ module dockyard.services { } var strings: IStringService = { - plan: { - error404: "Sorry, the Plan was not found. Perhaps it has been deleted.", + terminal: { error400: "Some of the specified data were invalid. Please verify your entry and try again.", - error: "Plan cannot be saved. Please try again in a few minutes." + error404: "The terminal was not found. Please make sure that you have the permissions to access it.", + error409: "A terminal with the specified URL has already been added to Fr8. Please try another URL.", + error: "Terminal cannot be saved. Please try again in a few minutes.", + localhost_dev: " cannot contain the string 'localhost'. Please correct the URL and try again.", + localhost_prod: " cannot contain the string 'localhost'. Please correct the URL and try again." } }; diff --git a/Scripts/app/services/UserService.ts b/Scripts/app/services/UserService.ts index abe3a660e7..9d4dd99788 100644 --- a/Scripts/app/services/UserService.ts +++ b/Scripts/app/services/UserService.ts @@ -12,6 +12,7 @@ module dockyard.services { getProfiles: () => Array<interfaces.IProfileDTO>, updateUserProfile: (data: interfaces.IUserDTO) => any, update: (data: { oldPassword: string, newPassword: string, confirmPassword: string }) => any; + checkPermission: (data: { permissionType: enums.PermissionType, objectType: string }) => any; } app.factory('UserService', [ @@ -43,6 +44,17 @@ module dockyard.services { confirmPassword: '@confirmPassword' } }, + checkPermission: { + method: 'GET', + isArray: false, + cache: true, + url: '/api/users/checkpermission', + params: { + permissionType: '@permissionType', + objectType: '@objectType', + username: '@userId' + } + }, updateUserProfile: { method: 'POST', isArray: false, diff --git a/Scripts/tests/e2e/authorizationPathways/docusign.spec.js b/Scripts/tests/e2e/authorizationPathways/docusign.spec.js new file mode 100644 index 0000000000..d7e2e437d1 --- /dev/null +++ b/Scripts/tests/e2e/authorizationPathways/docusign.spec.js @@ -0,0 +1,59 @@ +var PlansPage = require('../pages/plans.page.js'); +var ManageAuthTokens = require('../shared/manageAuthTokens.js'); +var AccountHelper = require('../shared/accountHelper.js'); +var MyAccountPage = require('../pages/myAccount.page.js'); +var UIHelpers = require('../shared/uiHelpers.js'); +var RegistrationPage = require('../pages/registration.page.js'); + +describe('DocuSign Authorization pathway test', function () { + var plansPage = new PlansPage(); + var manageAuthTokens = new ManageAuthTokens(); + var accountHelper = new AccountHelper(); + var myAccountPage = new MyAccountPage(); + var uiHelpers = new UIHelpers(); + + it('should login', function () { + return accountHelper.login().then(function () { + plansPage.setEmail(browser.params.username); + plansPage.setPassword(browser.params.password); + return plansPage.login().click().then(function () { + }); + }); + }); + + //it('should control and remove tokens', function () { + // return browser.driver.get(browser.baseUrl + '/dashboard/manageAuthTokens').then(function () { + // expect(element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div/div[1]/div[1]/div/div/div/div[1]/div[2]/table/thead/tr/th[1]'))); + // return manageAuthTokens.revokeAuthTokens(); + // }); + //}); + + it('should go to myAccount page', function () { + return myAccountPage.get(); + expect(browser.getCurrentUrl()).toEqual('http://dev.fr8.co/dashboard/myaccount'); + }); + + it('should add plan', function () { + return plansPage.addPlan().then(function () { + return plansPage.addActivity(); + }); + }); + + it('should add DocuSign Monitor activity', function () { + return plansPage.addDocuSignActivity().then(function () { + return plansPage.getDocuSignActivity(); + }); + }); + + describe('should logout', function () { + + var registrationPage = new RegistrationPage(); + + it('should logout', function () { + return accountHelper.logout().then(function () { + expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); + }); + }); + }); + +}); \ No newline at end of file diff --git a/Scripts/tests/e2e/authorizationPathways/google.spec.js b/Scripts/tests/e2e/authorizationPathways/google.spec.js new file mode 100644 index 0000000000..ad062e30db --- /dev/null +++ b/Scripts/tests/e2e/authorizationPathways/google.spec.js @@ -0,0 +1,72 @@ +var PlansPage = require('../pages/plans.page.js'); +var ManageAuthTokens = require('../shared/manageAuthTokens.js'); +var AccountHelper = require('../shared/accountHelper.js'); +var MyAccountPage = require('../pages/myAccount.page.js'); +var UIHelpers = require('../shared/uiHelpers.js'); +var RegistrationPage = require('../pages/registration.page.js'); + +describe('Google Authorization pathway test', function () { + var plansPage = new PlansPage(); + var manageAuthTokens = new ManageAuthTokens(); + var accountHelper = new AccountHelper(); + var myAccountPage = new MyAccountPage(); + var uiHelpers = new UIHelpers(); + + it('should login', function () { + return accountHelper.login().then(function () { + plansPage.setEmail(browser.params.username); + plansPage.setPassword(browser.params.password); + return plansPage.login().click().then(function () { + }); + }); + }); + + it('should control and remove tokens', function () { + return browser.driver.get(browser.baseUrl + '/dashboard/manageAuthTokens').then(function () { + expect(element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div/div[1]/div[1]/div/div/div/div[1]/div[2]/table/thead/tr/th[1]'))); + return manageAuthTokens.revokeAuthTokens(); + }); + }); + + it('should go to myAccount page', function () { + return myAccountPage.get(); + expect(browser.getCurrentUrl()).toEqual('http://dev.fr8.co/dashboard/myaccount'); + }); + + it('should add plan', function () { + return plansPage.addPlan().then(function () { + return plansPage.addActivity(); + }); + }); + + it('should add google activity', function () { + return plansPage.addGoogleActivity().then(function () { + return plansPage.getGoogleSheetActivity(); + }); + }); + + //it('should add account', function () { + // //var elm = element(by.className('.auth-link-account')); + // //return uiHelpers.waitReady(elm).then(function () { + // // googlePage.addAccount().then(function () { + // // return googlePage.getAllow(); + // // }); + // //}); + + // return plansPage.addAccount().then(function () { + // return plansPage.getAllow(); + // }); + //}); + + describe('should logout', function () { + + var registrationPage = new RegistrationPage(); + + it('should logout', function () { + return accountHelper.logout().then(function () { + expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); + }); + }); + }); + +}); \ No newline at end of file diff --git a/Scripts/tests/e2e/authorizationPathways/salesforce.spec.js b/Scripts/tests/e2e/authorizationPathways/salesforce.spec.js new file mode 100644 index 0000000000..d6003eb5d2 --- /dev/null +++ b/Scripts/tests/e2e/authorizationPathways/salesforce.spec.js @@ -0,0 +1,59 @@ +var PlansPage = require('../pages/plans.page.js'); +var ManageAuthTokens = require('../shared/manageAuthTokens.js'); +var AccountHelper = require('../shared/accountHelper.js'); +var MyAccountPage = require('../pages/myAccount.page.js'); +var UIHelpers = require('../shared/uiHelpers.js'); +var RegistrationPage = require('../pages/registration.page.js'); + +describe('SalesForce Authorization pathway test', function () { + var plansPage = new PlansPage(); + var manageAuthTokens = new ManageAuthTokens(); + var accountHelper = new AccountHelper(); + var myAccountPage = new MyAccountPage(); + var uiHelpers = new UIHelpers(); + + it('should login', function () { + return accountHelper.login().then(function () { + plansPage.setEmail(browser.params.username); + plansPage.setPassword(browser.params.password); + return plansPage.login().click().then(function () { + }); + }); + }); + + //it('should control and remove tokens', function () { + // return browser.driver.get(browser.baseUrl + '/dashboard/manageAuthTokens').then(function () { + // expect(element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div/div[1]/div[1]/div/div/div/div[1]/div[2]/table/thead/tr/th[1]'))); + // return manageAuthTokens.revokeAuthTokens(); + // }); + //}); + + it('should go to myAccount page', function () { + return myAccountPage.get(); + expect(browser.getCurrentUrl()).toEqual('http://dev.fr8.co/dashboard/myaccount'); + }); + + it('should add plan', function () { + return plansPage.addPlan().then(function () { + return plansPage.addActivity(); + }); + }); + + it('should add salesForce get data activity', function () { + return plansPage.addSalesForceActivity().then(function () { + return plansPage.getSalesForceGetDataActivity(); + }); + }); + + describe('should logout', function () { + + var registrationPage = new RegistrationPage(); + + it('should logout', function () { + return accountHelper.logout().then(function () { + expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); + }); + }); + }); + +}); \ No newline at end of file diff --git a/Scripts/tests/e2e/authorizationPathways/slack.spec.js b/Scripts/tests/e2e/authorizationPathways/slack.spec.js new file mode 100644 index 0000000000..ffe3d4a3ff --- /dev/null +++ b/Scripts/tests/e2e/authorizationPathways/slack.spec.js @@ -0,0 +1,58 @@ +var PlansPage = require('../pages/plans.page.js'); +var ManageAuthTokens = require('../shared/manageAuthTokens.js'); +var AccountHelper = require('../shared/accountHelper.js'); +var MyAccountPage = require('../pages/myAccount.page.js'); +var UIHelpers = require('../shared/uiHelpers.js'); +var RegistrationPage = require('../pages/registration.page.js'); + +describe('Slack Authorization pathway test', function () { + var plansPage = new PlansPage(); + var manageAuthTokens = new ManageAuthTokens(); + var accountHelper = new AccountHelper(); + var myAccountPage = new MyAccountPage(); + var uiHelpers = new UIHelpers(); + + it('should login', function () { + return accountHelper.login().then(function () { + plansPage.setEmail(browser.params.username); + plansPage.setPassword(browser.params.password); + return plansPage.login().click().then(function () { + }); + }); + }); + + //it('should control and remove tokens', function () { + // return browser.driver.get(browser.baseUrl + '/dashboard/manageAuthTokens').then(function () { + // expect(element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div/div[1]/div[1]/div/div/div/div[1]/div[2]/table/thead/tr/th[1]'))); + // return manageAuthTokens.revokeAuthTokens(); + // }); + //}); + + it('should go to myAccount page', function () { + return myAccountPage.get(); + expect(browser.getCurrentUrl()).toEqual('http://dev.fr8.co/dashboard/myaccount'); + }); + + it('should add plan', function () { + return plansPage.addPlan().then(function () { + return plansPage.addActivity(); + }); + }); + + it('should add Slack activity', function () { + return plansPage.addSlackActivity().then(function () { + return plansPage.getSlackMonitorActivity(); + }); + }); + + describe('should logout', function () { + + var registrationPage = new RegistrationPage(); + + it('should logout', function () { + return accountHelper.logout().then(function () { + expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); + }); + }); + }); +}); \ No newline at end of file diff --git a/Scripts/tests/e2e/conf.js b/Scripts/tests/e2e/conf.js index 585895857f..326a82ef6b 100644 --- a/Scripts/tests/e2e/conf.js +++ b/Scripts/tests/e2e/conf.js @@ -15,9 +15,16 @@ 'phantomjs.ghostdriver.cli.args': ['--loglevel=DEBUG'] }, framework: 'jasmine', - specs: ['**/*.spec.js'], + specs: ['**/registration.spec.js', + '**/*.spec.js' + ], jasmineNodeOpts: { defaultTimeoutInterval: 50000 }, - baseUrl: 'http://dev.fr8.co' + baseUrl: 'http://dev.fr8.co', + params: { + username: '', + password: '' + } }; + diff --git a/Scripts/tests/e2e/login/login.spec.js b/Scripts/tests/e2e/login/login.spec.js index c141017792..4b0e27f57c 100644 --- a/Scripts/tests/e2e/login/login.spec.js +++ b/Scripts/tests/e2e/login/login.spec.js @@ -11,8 +11,8 @@ describe('login page tests', function () { it('should login', function () { return accountHelper.login().then(function () { - loginPage.setEmail("integration_test_runner@fr8.company"); - loginPage.setPassword("fr8#s@lt!"); + loginPage.setEmail(browser.params.username); + loginPage.setPassword(browser.params.password); return loginPage.login().click().then(function () { expect(browser.getCurrentUrl()).toContain('/Welcome'); }); diff --git a/Scripts/tests/e2e/pages/myAccount.page.js b/Scripts/tests/e2e/pages/myAccount.page.js new file mode 100644 index 0000000000..74457df64a --- /dev/null +++ b/Scripts/tests/e2e/pages/myAccount.page.js @@ -0,0 +1,16 @@ +var MyAccountPage = function () { + var selectDropDownByName = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li/a/span')); + var logoutButton = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li/ul/li[3]/a')); + + this.get = function () { + browser.ignoreSynchronization = true; + browser.get(browser.baseUrl + '/dashboard/myaccount'); + }; + + this.selectDropDownByName = function () { + selectDropDownByName.click(); + return logoutButton.click(); + }; + +}; +module.exports = MyAccountPage; \ No newline at end of file diff --git a/Scripts/tests/e2e/pages/plans.page.js b/Scripts/tests/e2e/pages/plans.page.js new file mode 100644 index 0000000000..ce7d3d851e --- /dev/null +++ b/Scripts/tests/e2e/pages/plans.page.js @@ -0,0 +1,128 @@ +var UIHelpers = require('../shared/uiHelpers.js'); + +var PlansPage = function () { + + //Remove Token Properties + var manageAuthTokensButton = element(by.xpath('/html/body/div[1]/div/div[2]/div[2]/div/div/ul/li[5]/ul/li[1]/a')); + + /* Login Properties */ + var emailInput = element(by.id('Email')); + var passwordInput = element(by.id('Password')); + var loginButton = element(by.xpath('//*[@id="loginform"]/form/div[2]/div/div/button')); + + /* General Properties */ + var uiHelpers = new UIHelpers(); + var addPlanButton = element(by.xpath('//*[@id="Myfr8lines"]/h3/a')); + var addActivityButton = element(by.className('action-add-button-link')); + //var addAccountButton = element(by.className('.auth-link-account')); + + /* Add Google Activity Properties */ + var googleActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/div[11]/div[1]/img')); + var googleSheetActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/ul/li[1]/a/span')); + + /* SalesForce Activity Properties */ + var salesForceActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/div[15]/div[1]/img')); + var salesForceGetDataActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/ul/li[1]/a/span')); + + /*DocuSign Activity Properties */ + var docuSignActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/div[6]/div[1]/img')); + var docuSignMonitorActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/ul/li[1]/a/span')); + + /* Slack Activity Properties */ + var slackActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/div[17]/div[1]/img')); + var slackMonitorActivityButton = element(by.xpath('/html/body/div[2]/div[2]/div/div/div/div/div[1]/div[1]/div[1]/action-picker-panel/div/div[2]/div/ul/li[1]/a/span')); + + this.get = function () { + browser.ignoreSynchronization = true; + browser.get(browser.baseUrl + '/dashboard/myaccount'); + }; + + this.manageAuthTokens = function () { + return manageAuthTokensButton.click(); + }; + + this.setEmail = function (email) { + emailInput.sendKeys(email); + }; + + this.setPassword = function (password) { + passwordInput.sendKeys(password); + }; + + this.login = function () { + return loginButton; + }; + + this.addPlan = function () { + return uiHelpers.waitReady(addPlanButton).then(function () { + return addPlanButton.click(); + }); + }; + + this.addActivity = function () { + return uiHelpers.waitForElementToBePresent(addActivityButton).then(function () { + return addActivityButton.click(); + }); + }; + + this.addGoogleActivity = function () { + return uiHelpers.waitReady(googleActivityButton).then(function () { + return googleActivityButton.click(); + }); + }; + + this.getGoogleSheetActivity = function () { + return uiHelpers.waitReady(googleSheetActivityButton).then(function () { + return googleSheetActivityButton.click(); + }); + }; + + //this.addAccount = function () { + // //return browser.wait(EC.visibilityOf((googlePage.addAccountButton)), 5000).then(function () { + // //}); + // //return browser.wait(element(by.cssContainingText('.auth-link-account'))).then(function () { + // // return addAccountButton.click(); + // //}); + + // return uiHelpers.waitReady(addAccountButton).then(function () { + // return addAccountButton.click(); + // }); + //}; + + this.addSalesForceActivity = function () { + return uiHelpers.waitReady(salesForceActivityButton).then(function () { + return salesForceActivityButton.click(); + }); + }; + + this.getSalesForceGetDataActivity = function () { + return uiHelpers.waitReady(salesForceGetDataActivityButton).then(function () { + return salesForceGetDataActivityButton.click(); + }); + }; + + this.addDocuSignActivity = function () { + return uiHelpers.waitReady(docuSignActivityButton).then(function () { + return docuSignActivityButton.click(); + }); + }; + + this.getDocuSignActivity = function () { + return uiHelpers.waitReady(docuSignMonitorActivityButton).then(function () { + return docuSignMonitorActivityButton.click(); + }); + }; + + this.addSlackActivity = function () { + return uiHelpers.waitReady(slackActivityButton).then(function () { + return slackActivityButton.click(); + }); + }; + + this.getSlackMonitorActivity = function () { + return uiHelpers.waitReady(slackMonitorActivityButton).then(function () { + return slackMonitorActivityButton.click(); + }); + }; +}; +module.exports = PlansPage; \ No newline at end of file diff --git a/Scripts/tests/e2e/pages/registration.page.js b/Scripts/tests/e2e/pages/registration.page.js index 3661daece1..281e6edc71 100644 --- a/Scripts/tests/e2e/pages/registration.page.js +++ b/Scripts/tests/e2e/pages/registration.page.js @@ -1,48 +1,48 @@ -//var UIHelpers = require('../shared/uiHelpers.js'); - -//var RegistrationPage = function () { -// var emailInput = element(by.id('Email')); -// var passwordInput = element(by.id('Password')); -// var confirmPasswordInput = element(by.id('ConfirmPassword')); -// var registrationButton = element(by.buttonText('Register')); -// var organizationCheckBox = element(by.id('HasOrganization')); -// var accountMenu = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li')); -// var logoutButton = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li/ul/li[3]/a')); - -// var uiHelpers = new UIHelpers(); - -// this.get = function () { -// browser.ignoreSynchronization = true; -// return browser.get(browser.baseUrl + '/DockyardAccount/Register'); -// }; - -// this.setEmail = function (email) { -// emailInput.sendKeys(email); -// }; - -// this.setPassword = function (password) { -// passwordInput.sendKeys(password); -// }; - -// this.setConfirmPassword = function (confirmPassword) { -// confirmPasswordInput.sendKeys(confirmPassword); -// }; - -// this.setOrganization = function () { -// return organizationCheckBox.click(); -// }; - -// this.register = function () { -// return registrationButton; -// }; - -// this.accountMenuButton = function () { -// return accountMenu; -// }; - -// this.logout = function () { -// return logoutButton.click(); -// }; - -//}; -//module.exports = RegistrationPage; \ No newline at end of file +var UIHelpers = require('../shared/uiHelpers.js'); + +var RegistrationPage = function () { + var emailInput = element(by.id('Email')); + var passwordInput = element(by.id('Password')); + var confirmPasswordInput = element(by.id('ConfirmPassword')); + var registrationButton = element(by.buttonText('Register')); + var organizationCheckBox = element(by.id('HasOrganization')); + var accountMenu = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li')); + var logoutButton = element(by.xpath('/html/body/div[1]/div/div[2]/div[1]/div/div[2]/ul/li/ul/li[3]/a')); + + var uiHelpers = new UIHelpers(); + + this.get = function () { + browser.ignoreSynchronization = true; + return browser.get(browser.baseUrl + '/DockyardAccount/Register'); + }; + + this.setEmail = function (email) { + emailInput.sendKeys(email); + }; + + this.setPassword = function (password) { + passwordInput.sendKeys(password); + }; + + this.setConfirmPassword = function (confirmPassword) { + confirmPasswordInput.sendKeys(confirmPassword); + }; + + this.setOrganization = function () { + return organizationCheckBox.click(); + }; + + this.register = function () { + return registrationButton; + }; + + this.accountMenuButton = function () { + return accountMenu; + }; + + this.logout = function () { + return logoutButton.click(); + }; + +}; +module.exports = RegistrationPage; \ No newline at end of file diff --git a/Scripts/tests/e2e/registration/registration.spec.js b/Scripts/tests/e2e/registration/registration.spec.js index 3478b7e130..984943487d 100644 --- a/Scripts/tests/e2e/registration/registration.spec.js +++ b/Scripts/tests/e2e/registration/registration.spec.js @@ -1,37 +1,38 @@ -//var RegistrationPage = require('../pages/registration.page.js'); -//var AccountHelper = require('../shared/accountHelper.js'); -//var UIHelpers = require('../shared/uiHelpers.js'); -////var ConsoleLog = require('../shared/consoleLog.js'); - -//describe('registration page tests', function () { -// //PROPERTIES -// var uiHelpers = new UIHelpers(); -// var accountHelper = new AccountHelper(); -// var registrationPage = new RegistrationPage(); -// //var consoleLog = new ConsoleLog(); - -// it('should register', function () { -// return accountHelper.register().then(function () { -// registrationPage.setEmail("testuser_00075@fr8.co"); -// registrationPage.setPassword("123qwe"); -// registrationPage.setConfirmPassword("123qwe"); -// registrationPage.setOrganization(); -// return registrationPage.register().click().then(function () { -// expect(browser.getCurrentUrl()).toContain('/Welcome'); -// }); -// }); -// }); - -// describe('should logout', function () { - -// var registrationPage = new RegistrationPage(); - -// it('should logout', function () { -// return accountHelper.logout().then(function () { -// expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); -// }); -// }); -// }); - - -//}); +var RegistrationPage = require('../pages/registration.page.js'); +var AccountHelper = require('../shared/accountHelper.js'); +var UIHelpers = require('../shared/uiHelpers.js'); +//var ConsoleLog = require('../shared/consoleLog.js'); + +describe('registration page tests', function () { + //PROPERTIES + var uiHelpers = new UIHelpers(); + var accountHelper = new AccountHelper(); + var registrationPage = new RegistrationPage(); + //var consoleLog = new ConsoleLog(); + + it('should register', function () { + return accountHelper.register().then(function () { + registrationPage.setEmail(browser.params.username); + registrationPage.setPassword(browser.params.password); + registrationPage.setConfirmPassword(browser.params.password); + registrationPage.setOrganization(); + return registrationPage.register().click().then(function () { + expect(browser.getCurrentUrl()).toContain('/Welcome'); + }); + }); + }); + + describe('should logout', function () { + + var registrationPage = new RegistrationPage(); + + it('should logout', function () { + return accountHelper.logout().then(function () { + expect(browser.getCurrentUrl()).toContain('/DockyardAccount'); + }); + }); + }); + + + +}); diff --git a/Scripts/tests/e2e/shared/accountHelper.js b/Scripts/tests/e2e/shared/accountHelper.js index d490d804b3..6882cd6240 100644 --- a/Scripts/tests/e2e/shared/accountHelper.js +++ b/Scripts/tests/e2e/shared/accountHelper.js @@ -1,13 +1,14 @@ var LoginPage = require('../pages/login.page.js'); //var ContactPage = require('../pages/contact.page.js'); -//var GoogleAuthorizationPage = require('../pages/googleAuthorization.page.js'); -//var RegistrationPage = require('../pages/registration.page.js'); +var PlansPage = require('../pages/plans.page.js'); +var RegistrationPage = require('../pages/registration.page.js'); var UIHelpers = require('../shared/uiHelpers.js'); var AccountHelper = function () { var loginPage = new LoginPage(); - //var registrationPage = new RegistrationPage(); + var plansPage = new PlansPage(); + var registrationPage = new RegistrationPage(); var uiHelpers = new UIHelpers(); //var contactPage = new ContactPage(); @@ -23,15 +24,9 @@ var AccountHelper = function () { return registrationPage.get(); }; - //this.register = function () { - // return registrationPage.get().then(function () { - // registrationPage.setEmail("testuser_00074@fr8.co"); - // registrationPage.setPassword("123qwe"); - // registrationPage.setConfirmPassword("123qwe"); - // registrationPage.setOrganization(); - // return registrationPage.register(); - // }); - //}; + this.google = function () { + return plansPage.get(); + }; //this.sendContact = function () { // contactPage.setName("Fr8 Company"); diff --git a/Scripts/tests/e2e/shared/uiHelpers.js b/Scripts/tests/e2e/shared/uiHelpers.js index 859a1697d8..fd491ba48f 100644 --- a/Scripts/tests/e2e/shared/uiHelpers.js +++ b/Scripts/tests/e2e/shared/uiHelpers.js @@ -9,5 +9,61 @@ return element.isPresent(); }, timeout); }; + + // Helpers + function _refreshPage() { + // Swallow useless refresh page webdriver errors + browser.navigate().refresh().then(function () { }, function (e) { }); + }; + + // Config + var specTimeoutMs = 10000; // 10 seconds + + this.waitReady = function (element, opt_optStr) { + var self = element; + var driverWaitIterations = 0; + var lastWebdriverError; + function _throwError() { + throw new Error("Expected '" + self.locator().toString() + + "' to be present and visible. " + + "After " + driverWaitIterations + " driverWaitIterations. " + + "Last webdriver error: " + lastWebdriverError); + }; + + function _isPresentError(err) { + lastWebdriverError = (err != null) ? err.toString() : err; + return false; + }; + + return browser.driver.wait(function () { + driverWaitIterations++; + if (opt_optStr === 'withRefresh') { + // Refresh page after more than some retries + if (driverWaitIterations > 7) { + _refreshPage(); + } + } + return self.isPresent().then(function (present) { + if (present) { + return self.isDisplayed().then(function (visible) { + lastWebdriverError = 'visible:' + visible; + return visible; + }, _isPresentError); + } else { + lastWebdriverError = 'present:' + present; + return false; + } + }, _isPresentError); + }, specTimeoutMs).then(function (waitResult) { + if (!waitResult) { _throwError() }; + return waitResult; + }, function (err) { + _isPresentError(err); + _throwError(); + return false; + }); + }; + + }; module.exports = uiHelpers; \ No newline at end of file diff --git a/Scripts/tests/utils/fixture_ActionDTO.ts b/Scripts/tests/utils/fixture_ActionDTO.ts index 7757dd63d3..8dc4838238 100644 --- a/Scripts/tests/utils/fixture_ActionDTO.ts +++ b/Scripts/tests/utils/fixture_ActionDTO.ts @@ -8,7 +8,7 @@ module dockyard.tests.utils.fixtures { public static newPlan = <interfaces.IPlanVM> { name: 'Test', description: 'Description', - planState: 1 + planState: model.PlanState.Inactive }; public static configurationControls = <models.ControlsList>{ @@ -113,7 +113,6 @@ module dockyard.tests.utils.fixtures { activityTemplate: { name: 'test' }, - currentView: null, id: 'E55315F9-A30B-4196-A43D-6F511B91CCF8' }; @@ -145,7 +144,6 @@ module dockyard.tests.utils.fixtures { activityTemplate: { name: 'test' }, - currentView: null, id: 'E55315F9-A30B-4196-A43D-6F511B91CCF8' }; @@ -177,7 +175,6 @@ module dockyard.tests.utils.fixtures { activityTemplate: { name: 'test' }, - currentView: null, id: 'E55315F9-A30B-4196-A43D-6F511B91CCF8' }; @@ -201,7 +198,6 @@ module dockyard.tests.utils.fixtures { activityTemplate: { name: 'test' }, - currentView: null, id: 'E55315F9-A30B-4196-A43D-6F511B91CCF8' }; diff --git a/Scripts/tests/utils/fixture_FieldDTO.ts b/Scripts/tests/utils/fixture_FieldDTO.ts index 14506bb892..ac493908fa 100644 --- a/Scripts/tests/utils/fixture_FieldDTO.ts +++ b/Scripts/tests/utils/fixture_FieldDTO.ts @@ -6,7 +6,7 @@ module dockyard.tests.utils.fixtures { public static newPlan = <interfaces.IPlanVM>{ name: 'Test', description: 'Description', - planState: 1 + planState: model.PlanState.Inactive }; public static filePickerField: model.File = { diff --git a/Scripts/tests/utils/fixture_PlanBuilder.ts b/Scripts/tests/utils/fixture_PlanBuilder.ts index c9c48d222c..0af3192c12 100644 --- a/Scripts/tests/utils/fixture_PlanBuilder.ts +++ b/Scripts/tests/utils/fixture_PlanBuilder.ts @@ -5,7 +5,7 @@ id: '89EBF277-0CC4-4D6D-856B-52457F10C686', name: "MockPlan", description: "MockPlan", - planState: 1, + planState: model.PlanState.Inactive, subscribedDocuSignTemplates: [], externalEventSubscription: [], startingSubPlanId: 1 @@ -16,14 +16,14 @@ public static updatedPlan = <interfaces.IPlanVM>{ 'name': 'Updated', 'description': 'Description', - 'planState': 1, + 'planState': model.PlanState.Inactive, 'subscribedDocuSignTemplates': ['58521204-58af-4e65-8a77-4f4b51fef626'] } public static fullPlan = <interfaces.IPlanVM>{ 'name': 'Updated', 'description': 'Description', - 'planState': 1, + 'planState': model.PlanState.Inactive, 'subscribedDocuSignTemplates': ['58521204-58af-4e65-8a77-4f4b51fef626'], subPlans: [ <model.SubPlanDTO>{ diff --git a/Scripts/typings/angular-material/angular-material.d.ts b/Scripts/typings/angular-material/angular-material.d.ts new file mode 100644 index 0000000000..c19dae9dbd --- /dev/null +++ b/Scripts/typings/angular-material/angular-material.d.ts @@ -0,0 +1,364 @@ +// Type definitions for Angular Material 1.1.0-rc5+ (angular.material module) +// Project: https://github.com/angular/material +// Definitions by: Alex Staroselsky <https://github.com/AlStar01>, Blake Bigelow <https://github.com/blbigelow>, Peter Hajdu <https://github.com/PeterHajdu> +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped + +/// <reference path="../angularjs/angular.d.ts" /> + +declare module 'angular-material' { +    var _: string; +   export = _; +} + +declare namespace angular.material { + + interface IBottomSheetOptions { + templateUrl?: string; + template?: string; + scope?: angular.IScope; // default: new child scope + preserveScope?: boolean; // default: false + controller?: string|Function; + locals?: {[index: string]: any}; + clickOutsideToClose?: boolean; + disableBackdrop?: boolean; + escapeToClose?: boolean; + resolve?: {[index: string]: angular.IPromise<any>}; + controllerAs?: string; + parent?: Function|string|Object; // default: root node + disableParentScroll?: boolean; // default: true + } + + interface IBottomSheetService { + show(options: IBottomSheetOptions): angular.IPromise<any>; + hide(response?: any): void; + cancel(response?: any): void; + } + + interface IPresetDialog<T> { + title(title: string): T; + textContent(textContent: string): T; + htmlContent(htmlContent: string): T; + ok(ok: string): T; + theme(theme: string): T; + templateUrl(templateUrl?: string): T; + template(template?: string): T; + targetEvent(targetEvent?: MouseEvent): T; + scope(scope?: angular.IScope): T; // default: new child scope + preserveScope(preserveScope?: boolean): T; // default: false + disableParentScroll(disableParentScroll?: boolean): T; // default: true + hasBackdrop(hasBackdrop?: boolean): T; // default: true + clickOutsideToClose(clickOutsideToClose?: boolean): T; // default: false + escapeToClose(escapeToClose?: boolean): T; // default: true + focusOnOpen(focusOnOpen?: boolean): T; // default: true + controller(controller?: string|Function): T; + locals(locals?: {[index: string]: any}): T; + bindToController(bindToController?: boolean): T; // default: false + resolve(resolve?: {[index: string]: angular.IPromise<any>}): T; + controllerAs(controllerAs?: string): T; + parent(parent?: string|Element|JQuery): T; // default: root node + onComplete(onComplete?: Function): T; + ariaLabel(ariaLabel: string): T; + } + + interface IAlertDialog extends IPresetDialog<IAlertDialog> { + } + + interface IConfirmDialog extends IPresetDialog<IConfirmDialog> { + cancel(cancel: string): IConfirmDialog; + } + + interface IPromptDialog extends IPresetDialog<IPromptDialog> { + cancel(cancel: string): IPromptDialog; + placeholder(placeholder: string): IPromptDialog; + initialValue(initialValue: string): IPromptDialog; + } + + interface IDialogOptions { + templateUrl?: string; + template?: string; + contentElement?: string|Element; + autoWrap?: boolean; // default: true + targetEvent?: MouseEvent; + openFrom?: any; + closeTo?: any; + scope?: angular.IScope; // default: new child scope + preserveScope?: boolean; // default: false + disableParentScroll?: boolean; // default: true + hasBackdrop?: boolean; // default: true + clickOutsideToClose?: boolean; // default: false + escapeToClose?: boolean; // default: true + focusOnOpen?: boolean; // default: true + controller?: string|Function; + locals?: {[index: string]: any}; + bindToController?: boolean; // default: false + resolve?: {[index: string]: angular.IPromise<any>} + controllerAs?: string; + parent?: string|Element|JQuery; // default: root node + onShowing?: Function; + onComplete?: Function; + onRemoving?: Function; + skipHide?: boolean; + fullscreen?: boolean; // default: false + } + + interface IDialogService { + show(dialog: IDialogOptions|IAlertDialog|IConfirmDialog|IPromptDialog): angular.IPromise<any>; + confirm(): IConfirmDialog; + alert(): IAlertDialog; + prompt(): IPromptDialog; + hide(response?: any): angular.IPromise<any>; + cancel(response?: any): void; + } + + interface IIcon { + (id: string): angular.IPromise<Element>; // id is a unique ID or URL + } + + interface IIconProvider { + icon(id: string, url: string, viewBoxSize?: number): IIconProvider; // viewBoxSize default: 24 + iconSet(id: string, url: string, viewBoxSize?: number): IIconProvider; // viewBoxSize default: 24 + defaultIconSet(url: string, viewBoxSize?: number): IIconProvider; // viewBoxSize default: 24 + defaultViewBoxSize(viewBoxSize: number): IIconProvider; // default: 24 + defaultFontSet(name: string): IIconProvider; + } + + interface IMedia { + (media: string): boolean; + } + + interface ISidenavObject { + toggle(): angular.IPromise<void>; + open(): angular.IPromise<void>; + close(): angular.IPromise<void>; + isOpen(): boolean; + isLockedOpen(): boolean; + } + + interface ISidenavService { + (component: string, enableWait: boolean): angular.IPromise<ISidenavObject>; + (component: string): ISidenavObject; + } + + interface IToastPreset<T> { + textContent(content: string): T; + action(action: string): T; + highlightAction(highlightAction: boolean): T; + highlightClass(highlightClass: string): T; + capsule(capsule: boolean): T; + theme(theme: string): T; + hideDelay(delay: number): T; + position(position: string): T; + parent(parent?: string|Element|JQuery): T; // default: root node + } + + interface ISimpleToastPreset extends IToastPreset<ISimpleToastPreset> { + } + + interface IToastOptions { + templateUrl?: string; + template?: string; + autoWrap?:boolean; + scope?: angular.IScope; // default: new child scope + preserveScope?: boolean; // default: false + hideDelay?: number; // default (ms): 3000 + position?: string; // any combination of 'bottom'/'left'/'top'/'right'/'fit'; default: 'bottom left' + controller?: string|Function; + locals?: {[index: string]: any}; + bindToController?: boolean; // default: false + resolve?: {[index: string]: angular.IPromise<any>} + controllerAs?: string; + parent?: string|Element|JQuery; // default: root node + } + + interface IToastService { + show(optionsOrPreset: IToastOptions|IToastPreset<any>): angular.IPromise<any>; + showSimple(content: string): angular.IPromise<any>; + simple(): ISimpleToastPreset; + build(): IToastPreset<any>; + updateContent(): void; + hide(response?: any): void; + cancel(response?: any): void; + } + + interface IPalette { + 0?: string; + 50?: string; + 100?: string; + 200?: string; + 300?: string; + 400?: string; + 500?: string; + 600?: string; + 700?: string; + 800?: string; + 900?: string; + A100?: string; + A200?: string; + A400?: string; + A700?: string; + contrastDefaultColor?: string; + contrastDarkColors?: string|string[]; + contrastLightColors?: string|string[]; + } + + interface IThemeHues { + default?: string; + 'hue-1'?: string; + 'hue-2'?: string; + 'hue-3'?: string; + } + + interface IThemePalette { + name: string; + hues: IThemeHues; + } + + interface IThemeColors { + accent: IThemePalette; + background: IThemePalette; + primary: IThemePalette; + warn: IThemePalette; + } + + interface IThemeGrayScalePalette { + 1: string; + 2: string; + 3: string; + 4: string; + name: string; + } + + interface ITheme { + name: string; + isDark: boolean; + colors: IThemeColors; + foregroundPalette: IThemeGrayScalePalette; + foregroundShadow: string; + accentPalette(name: string, hues?: IThemeHues): ITheme; + primaryPalette(name: string, hues?: IThemeHues): ITheme; + warnPalette(name: string, hues?: IThemeHues): ITheme; + backgroundPalette(name: string, hues?: IThemeHues): ITheme; + dark(isDark?: boolean): ITheme; + } + + interface IThemingProvider { + theme(name: string, inheritFrom?: string): ITheme; + definePalette(name: string, palette: IPalette): IThemingProvider; + extendPalette(name: string, palette: IPalette): IPalette; + setDefaultTheme(theme: string): void; + alwaysWatchTheme(alwaysWatch: boolean): void; + setNonce(nonce: string): void; + } + + interface IDateLocaleProvider { + months: string[]; + shortMonths: string[]; + days: string[]; + shortDays: string[]; + dates: string[]; + firstDayOfWeek: number; + parseDate(dateString: string): Date; + formatDate(date: Date): string; + monthHeaderFormatter(date: Date): string; + weekNumberFormatter(weekNumber: number): string; + msgCalendar: string; + msgOpenCalendar: string; + } + + interface IMenuService { + hide(response?: any, options?: any): angular.IPromise<any>; + } + + interface IColorPalette { + red: IPalette; + pink: IPalette; + 'deep-purple': IPalette; + indigo: IPalette; + blue: IPalette; + 'light-blue': IPalette; + cyan: IPalette; + teal: IPalette; + green: IPalette; + 'light-green': IPalette; + lime: IPalette; + yellow: IPalette; + amber: IPalette; + orange: IPalette; + 'deep-orange': IPalette; + brown: IPalette; + grey: IPalette; + 'blue-grey': IPalette; + } + + interface IPanelConfig { + template?: string; + templateUrl?: string; + controller?: string|Function; + controllerAs?: string; + bindToController?: boolean; // default: true + locals?: {[index: string]: any}; + resolve?: {[index: string]: angular.IPromise<any>} + attachTo?: string|JQuery|Element; + panelClass?: string; + zIndex?: number; // default: 80 + position?: IPanelPosition; + clickOutsideToClose?: boolean; // default: false + escapeToClose?: boolean; // default: false + trapFocus?: boolean; // default: false + focusOnOpen?: boolean; // default: true + fullscreen?: boolean; // default: false + animation?: IPanelAnimation; + hasBackdrop?: boolean; // default: false + disableParentScroll?: boolean; // default: false + onDomAdded?: Function; + onOpenComplete?: Function; + onRemoving?: Function; + onDomRemoved?: Function; + origin?: string|JQuery|Element; + } + + interface IPanelRef { + id: string; + config: IPanelConfig; + isAttached: boolean; + open(): angular.IPromise<any>; + close(): angular.IPromise<any>; + attach(): angular.IPromise<any>; + detach(): angular.IPromise<any>; + show(): angular.IPromise<any>; + hide(): angular.IPromise<any>; + destroy(): void; + addClass(newClass: string): void; + removeClass(oldClass: string): void; + toggleClass(toggleClass: string): void; + focusOnOpen(): void; + } + + interface IPanelPosition { + absolute(): IPanelPosition; + relativeTo(someElement: string|JQuery|Element): IPanelPosition; + top(opt_top: string): IPanelPosition; // default: '0' + bottom(opt_bottom: string): IPanelPosition; // default: '0' + left(opt_left: string): IPanelPosition; // default: '0' + right(opt_right: string): IPanelPosition; // default: '0' + centerHorizontally(): IPanelPosition; + centerVertically(): IPanelPosition; + center(): IPanelPosition; + addPanelPosition(xPosition: string, yPosition: string): IPanelPosition; + withOffsetX(offsetX: string): IPanelPosition; + withOffsetY(offsetY: string): IPanelPosition; + } + + interface IPanelAnimation { + openFrom(from: string|Element|Event|{top: number, left: number}): IPanelAnimation; + closeTo(to: string|Element|{top: number, left: number}): IPanelAnimation; + withAnimation(cssClass: string|{open: string, close: string}): IPanelAnimation; + } + + interface IPanelService { + create(opt_config: IPanelConfig): IPanelRef; + open(opt_config: IPanelConfig): angular.IPromise<IPanelRef>; + newPanelPosition(): IPanelPosition; + newPanelAnimation(): IPanelAnimation; + } +} diff --git a/Scripts/typings/angularjs/angular.d.ts b/Scripts/typings/angularjs/angular.d.ts index 3728552f76..e64496604f 100644 --- a/Scripts/typings/angularjs/angular.d.ts +++ b/Scripts/typings/angularjs/angular.d.ts @@ -1,7 +1,7 @@ -// Type definitions for Angular JS 1.4+ +// Type definitions for Angular JS 1.5 // Project: http://angularjs.org // Definitions by: Diego Vilar <http://github.com/diegovilar> -// Definitions: https://github.com/borisyankov/DefinitelyTyped +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /// <reference path="../jquery/jquery.d.ts" /> @@ -23,7 +23,7 @@ declare module 'angular' { /////////////////////////////////////////////////////////////////////////////// // ng module (angular.js) /////////////////////////////////////////////////////////////////////////////// -declare module angular { +declare namespace angular { // not directly implemented, but ensures that constructed class implements $get interface IServiceProviderClass { @@ -56,132 +56,11 @@ declare module angular { * @param element DOM element which is the root of angular application. * @param modules An array of modules to load into the application. * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. + * function that will be invoked by the injector as a config block. * @param config an object for defining configuration options for the application. The following keys are supported: * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. */ - bootstrap(element: string, modules?: string, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: string, modules?: Function, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: string, modules?: string[], config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: JQuery, modules?: string, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: JQuery, modules?: Function, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: JQuery, modules?: string[], config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Element, modules?: string, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Element, modules?: Function, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Element, modules?: string[], config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Document, modules?: string, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Document, modules?: Function, config?: IAngularBootstrapConfig): auto.IInjectorService; - /** - * Use this function to manually start up angular application. - * - * @param element DOM element which is the root of angular application. - * @param modules An array of modules to load into the application. - * Each item in the array should be the name of a predefined module or a (DI annotated) - * function that will be invoked by the injector as a run block. - * @param config an object for defining configuration options for the application. The following keys are supported: - * - `strictDi`: disable automatic function annotation for the application. This is meant to assist in finding bugs which break minified code. - */ - bootstrap(element: Document, modules?: string[], config?: IAngularBootstrapConfig): auto.IInjectorService; + bootstrap(element: string|Element|JQuery|Document, modules?: (string|Function|any[])[], config?: IAngularBootstrapConfig): auto.IInjectorService; /** * Creates a deep copy of source, which should be an object or an array. @@ -201,7 +80,7 @@ declare module angular { * * If jQuery is available, angular.element is an alias for the jQuery function. If jQuery is not available, angular.element delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite." */ - element: IAugmentedJQueryStatic; + element: JQueryStatic; equals(value1: any, value2: any): boolean; extend(destination: any, ...sources: any[]): any; @@ -237,16 +116,16 @@ declare module angular { forEach(obj: any, iterator: (value: any, key: any) => any, context?: any): any; fromJson(json: string): any; - identity(arg?: any): any; + identity<T>(arg?: T): T; injector(modules?: any[], strictDi?: boolean): auto.IInjectorService; - isArray(value: any): boolean; - isDate(value: any): boolean; + isArray(value: any): value is Array<any>; + isDate(value: any): value is Date; isDefined(value: any): boolean; isElement(value: any): boolean; - isFunction(value: any): boolean; - isNumber(value: any): boolean; - isObject(value: any): boolean; - isString(value: any): boolean; + isFunction(value: any): value is Function; + isNumber(value: any): value is number; + isObject(value: any): value is Object; + isString(value: any): value is string; isUndefined(value: any): boolean; lowercase(str: string): string; @@ -276,7 +155,7 @@ declare module angular { noop(...args: any[]): void; reloadWithDebugInfo(): void; - toJson(obj: any, pretty?: boolean): string; + toJson(obj: any, pretty?: boolean | number): string; uppercase(str: string): string; version: { full: string; @@ -285,6 +164,12 @@ declare module angular { dot: number; codeName: string; }; + + /** + * If window.name contains prefix NG_DEFER_BOOTSTRAP! when angular.bootstrap is called, the bootstrap process will be paused until angular.resumeBootstrap() is called. + * @param extraModules An optional array of modules that should be added to the original list of modules that the app was about to be bootstrapped with. + */ + resumeBootstrap?(extraModules?: string[]): ng.auto.IInjectorService; } /////////////////////////////////////////////////////////////////////////// @@ -292,9 +177,13 @@ declare module angular { // see http://docs.angularjs.org/api/angular.Module /////////////////////////////////////////////////////////////////////////// interface IModule { - animation(name: string, animationFactory: Function): IModule; - animation(name: string, inlineAnnotatedFunction: any[]): IModule; - animation(object: Object): IModule; + /** + * Use this method to register a component. + * + * @param name The name of the component. + * @param options A definition object passed into the component. + */ + component(name: string, options: IComponentOptions): IModule; /** * Use this method to register work which needs to be performed on module loading. * @@ -307,13 +196,14 @@ declare module angular { * @param inlineAnnotatedFunction Execute this function on module load. Useful for service configuration. */ config(inlineAnnotatedFunction: any[]): IModule; + config(object: Object): IModule; /** * Register a constant service, such as a string, a number, an array, an object or a function, with the $injector. Unlike value it can be injected into a module configuration function (see config) and it cannot be overridden by an Angular decorator. * * @param name The name of the constant. * @param value The constant value. */ - constant(name: string, value: any): IModule; + constant<T>(name: string, value: T): IModule; constant(object: Object): IModule; /** * The $controller service is used by Angular to create new controllers. @@ -380,7 +270,19 @@ declare module angular { * Run blocks are the closest thing in Angular to the main method. A run block is the code which needs to run to kickstart the application. It is executed after all of the service have been configured and the injector has been created. Run blocks typically contain code which is hard to unit-test, and for this reason should be declared in isolated modules, so that they can be ignored in the unit-tests. */ run(inlineAnnotatedFunction: any[]): IModule; + /** + * Register a service constructor, which will be invoked with new to create the service instance. This is short for registering a service where its provider's $get property is a factory function that returns an instance instantiated by the injector from the service constructor function. + * + * @param name The name of the instance. + * @param serviceConstructor An injectable class (constructor function) that will be instantiated. + */ service(name: string, serviceConstructor: Function): IModule; + /** + * Register a service constructor, which will be invoked with new to create the service instance. This is short for registering a service where its provider's $get property is a factory function that returns an instance instantiated by the injector from the service constructor function. + * + * @param name The name of the instance. + * @param inlineAnnotatedConstructor An injectable class (constructor function) that will be instantiated. + */ service(name: string, inlineAnnotatedConstructor: any[]): IModule; service(object: Object): IModule; /** @@ -391,7 +293,7 @@ declare module angular { * @param name The name of the instance. * @param value The value. */ - value(name: string, value: any): IModule; + value<T>(name: string, value: T): IModule; value(object: Object): IModule; /** @@ -426,7 +328,7 @@ declare module angular { * * For further information check out the guide on @see https://docs.angularjs.org/guide/directive#matching-directives */ - $normalize(name: string): void; + $normalize(name: string): string; /** * Adds the CSS class value specified by the classVal parameter to the @@ -442,6 +344,12 @@ declare module angular { */ $removeClass(classVal: string): void; + /** + * Adds and removes the appropriate CSS class values to the element based on the difference between + * the new and old CSS class values (specified as newClasses and oldClasses). + */ + $updateClass(newClasses: string, oldClasses: string): void; + /** * Set DOM element attribute value. */ @@ -453,7 +361,7 @@ declare module angular { * following compilation. The observer is then invoked whenever the * interpolated value changes. */ - $observe(name: string, fn: (value?: any) => any): Function; + $observe<T>(name: string, fn: (value?: T) => any): Function; /** * A map of DOM element attribute names to the normalized name. This is needed @@ -479,9 +387,11 @@ declare module angular { $invalid: boolean; $submitted: boolean; $error: any; - $addControl(control: INgModelController): void; - $removeControl(control: INgModelController): void; - $setValidity(validationErrorKey: string, isValid: boolean, control: INgModelController): void; + $name: string; + $pending: any; + $addControl(control: INgModelController | IFormController): void; + $removeControl(control: INgModelController | IFormController): void; + $setValidity(validationErrorKey: string, isValid: boolean, control: INgModelController | IFormController): void; $setDirty(): void; $setPristine(): void; $commitViewValue(): void; @@ -532,6 +442,16 @@ declare module angular { $invalid: boolean; } + //Allows tuning how model updates are done. + //https://docs.angularjs.org/api/ng/directive/ngModelOptions + interface INgModelOptions { + updateOn?: string; + debounce?: any; + allowInvalid?: boolean; + getterSetter?: boolean; + timezone?: string; + } + interface IModelValidators { /** * viewValue is any because it can be an object that is called in the view like $viewValue.name:$viewValue.subName @@ -614,18 +534,18 @@ declare module angular { * @param name Event name to listen on. * @param listener Function to call when the event is emitted. */ - $on(name: string, listener: (event: IAngularEvent, ...args: any[]) => any): Function; + $on(name: string, listener: (event: IAngularEvent, ...args: any[]) => any): () => void; - $watch(watchExpression: string, listener?: string, objectEquality?: boolean): Function; - $watch<T>(watchExpression: string, listener?: (newValue: T, oldValue: T, scope: IScope) => any, objectEquality?: boolean): Function; - $watch(watchExpression: (scope: IScope) => any, listener?: string, objectEquality?: boolean): Function; - $watch<T>(watchExpression: (scope: IScope) => T, listener?: (newValue: T, oldValue: T, scope: IScope) => any, objectEquality?: boolean): Function; + $watch(watchExpression: string, listener?: string, objectEquality?: boolean): () => void; + $watch<T>(watchExpression: string, listener?: (newValue: T, oldValue: T, scope: IScope) => any, objectEquality?: boolean): () => void; + $watch(watchExpression: (scope: IScope) => any, listener?: string, objectEquality?: boolean): () => void; + $watch<T>(watchExpression: (scope: IScope) => T, listener?: (newValue: T, oldValue: T, scope: IScope) => any, objectEquality?: boolean): () => void; - $watchCollection<T>(watchExpression: string, listener: (newValue: T, oldValue: T, scope: IScope) => any): Function; - $watchCollection<T>(watchExpression: (scope: IScope) => T, listener: (newValue: T, oldValue: T, scope: IScope) => any): Function; + $watchCollection<T>(watchExpression: string, listener: (newValue: T, oldValue: T, scope: IScope) => any): () => void; + $watchCollection<T>(watchExpression: (scope: IScope) => T, listener: (newValue: T, oldValue: T, scope: IScope) => any): () => void; - $watchGroup(watchExpressions: any[], listener: (newValue: any, oldValue: any, scope: IScope) => any): Function; - $watchGroup(watchExpressions: { (scope: IScope): any }[], listener: (newValue: any, oldValue: any, scope: IScope) => any): Function; + $watchGroup(watchExpressions: any[], listener: (newValue: any, oldValue: any, scope: IScope) => any): () => void; + $watchGroup(watchExpressions: { (scope: IScope): any }[], listener: (newValue: any, oldValue: any, scope: IScope) => any): () => void; $parent: IScope; $root: IRootScopeService; @@ -674,7 +594,7 @@ declare module angular { */ $odd: boolean; - } + } interface IAngularEvent { /** @@ -711,22 +631,14 @@ declare module angular { [key: string]: any; } - /////////////////////////////////////////////////////////////////////////// - // BrowserService - // TODO undocumented, so we need to get it from the source code - /////////////////////////////////////////////////////////////////////////// - interface IBrowserService { - defer: angular.ITimeoutService; - [key: string]: any; - } - /////////////////////////////////////////////////////////////////////////// // TimeoutService // see http://docs.angularjs.org/api/ng.$timeout /////////////////////////////////////////////////////////////////////////// interface ITimeoutService { - (func: Function, delay?: number, invokeApply?: boolean): IPromise<any>; - cancel(promise: IPromise<any>): boolean; + (delay?: number, invokeApply?: boolean): IPromise<void>; + <T>(fn: (...args: any[]) => T, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>; + cancel(promise?: IPromise<any>): boolean; } /////////////////////////////////////////////////////////////////////////// @@ -734,39 +646,10 @@ declare module angular { // see http://docs.angularjs.org/api/ng.$interval /////////////////////////////////////////////////////////////////////////// interface IIntervalService { - (func: Function, delay: number, count?: number, invokeApply?: boolean): IPromise<any>; + (func: Function, delay: number, count?: number, invokeApply?: boolean, ...args: any[]): IPromise<any>; cancel(promise: IPromise<any>): boolean; } - /////////////////////////////////////////////////////////////////////////// - // AngularProvider - // see http://docs.angularjs.org/api/ng/provider/$animateProvider - /////////////////////////////////////////////////////////////////////////// - interface IAnimateProvider { - /** - * Registers a new injectable animation factory function. - * - * @param name The name of the animation. - * @param factory The factory function that will be executed to return the animation object. - */ - register(name: string, factory: () => IAnimateCallbackObject): void; - - /** - * Gets and/or sets the CSS class expression that is checked when performing an animation. - * - * @param expression The className expression which will be checked against all animations. - * @returns The current CSS className expression value. If null then there is no expression value. - */ - classNameFilter(expression?: RegExp): RegExp; - } - - /** - * The animation object which contains callback functions for each event that is expected to be animated. - */ - interface IAnimateCallbackObject { - eventFn(element: Node, doneFn: () => void): Function; - } - /** * $filter - $filterProvider - service in module ng * @@ -775,13 +658,125 @@ declare module angular { * see https://docs.angularjs.org/api/ng/service/$filter */ interface IFilterService { + (name: 'filter'): IFilterFilter; + (name: 'currency'): IFilterCurrency; + (name: 'number'): IFilterNumber; + (name: 'date'): IFilterDate; + (name: 'json'): IFilterJson; + (name: 'lowercase'): IFilterLowercase; + (name: 'uppercase'): IFilterUppercase; + (name: 'limitTo'): IFilterLimitTo; + (name: 'orderBy'): IFilterOrderBy; /** * Usage: * $filter(name); * * @param name Name of the filter function to retrieve */ - (name: string): Function; + <T>(name: string): T; + } + + interface IFilterFilter { + <T>(array: T[], expression: string | IFilterFilterPatternObject | IFilterFilterPredicateFunc<T>, comparator?: IFilterFilterComparatorFunc<T>|boolean): T[]; + } + + interface IFilterFilterPatternObject { + [name: string]: any; + } + + interface IFilterFilterPredicateFunc<T> { + (value: T, index: number, array: T[]): boolean; + } + + interface IFilterFilterComparatorFunc<T> { + (actual: T, expected: T): boolean; + } + + interface IFilterCurrency { + /** + * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default symbol for current locale is used. + * @param amount Input to filter. + * @param symbol Currency symbol or identifier to be displayed. + * @param fractionSize Number of decimal places to round the amount to, defaults to default max fraction size for current locale + * @return Formatted number + */ + (amount: number, symbol?: string, fractionSize?: number): string; + } + + interface IFilterNumber { + /** + * Formats a number as text. + * @param number Number to format. + * @param fractionSize Number of decimal places to round the number to. If this is not provided then the fraction size is computed from the current locale's number formatting pattern. In the case of the default locale, it will be 3. + * @return Number rounded to decimalPlaces and places a “,” after each third digit. + */ + (value: number|string, fractionSize?: number|string): string; + } + + interface IFilterDate { + /** + * Formats date to a string based on the requested format. + * + * @param date Date to format either as Date object, milliseconds (string or number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is specified in the string input, the time is considered to be in the local timezone. + * @param format Formatting rules (see Description). If not specified, mediumDate is used. + * @param timezone Timezone to be used for formatting. It understands UTC/GMT and the continental US time zone abbreviations, but for general use, use a time zone offset, for example, '+0430' (4 hours, 30 minutes east of the Greenwich meridian) If not specified, the timezone of the browser will be used. + * @return Formatted string or the input if input is not recognized as date/millis. + */ + (date: Date | number | string, format?: string, timezone?: string): string; + } + + interface IFilterJson { + /** + * Allows you to convert a JavaScript object into JSON string. + * @param object Any JavaScript object (including arrays and primitive types) to filter. + * @param spacing The number of spaces to use per indentation, defaults to 2. + * @return JSON string. + */ + (object: any, spacing?: number): string; + } + + interface IFilterLowercase { + /** + * Converts string to lowercase. + */ + (value: string): string; + } + + interface IFilterUppercase { + /** + * Converts string to uppercase. + */ + (value: string): string; + } + + interface IFilterLimitTo { + /** + * Creates a new array containing only a specified number of elements. The elements are taken from either the beginning or the end of the source array, string or number, as specified by the value and sign (positive or negative) of limit. + * @param input Source array to be limited. + * @param limit The length of the returned array. If the limit number is positive, limit number of items from the beginning of the source array/string are copied. If the number is negative, limit number of items from the end of the source array are copied. The limit will be trimmed if it exceeds array.length. If limit is undefined, the input will be returned unchanged. + * @param begin Index at which to begin limitation. As a negative index, begin indicates an offset from the end of input. Defaults to 0. + * @return A new sub-array of length limit or less if input array had less than limit elements. + */ + <T>(input: T[], limit: string|number, begin?: string|number): T[]; + /** + * Creates a new string containing only a specified number of elements. The elements are taken from either the beginning or the end of the source string or number, as specified by the value and sign (positive or negative) of limit. If a number is used as input, it is converted to a string. + * @param input Source string or number to be limited. + * @param limit The length of the returned string. If the limit number is positive, limit number of items from the beginning of the source string are copied. If the number is negative, limit number of items from the end of the source string are copied. The limit will be trimmed if it exceeds input.length. If limit is undefined, the input will be returned unchanged. + * @param begin Index at which to begin limitation. As a negative index, begin indicates an offset from the end of input. Defaults to 0. + * @return A new substring of length limit or less if input had less than limit elements. + */ + (input: string|number, limit: string|number, begin?: string|number): string; + } + + interface IFilterOrderBy { + /** + * Orders a specified array by the expression predicate. It is ordered alphabetically for strings and numerically for numbers. Note: if you notice numbers are not being sorted as expected, make sure they are actually being saved as numbers and not strings. + * @param array The array to sort. + * @param expression A predicate to be used by the comparator to determine the order of elements. + * @param reverse Reverse the order of the array. + * @return Reverse the order of the array. + */ + <T>(array: T[], expression: string|((value: T) => any)|(((value: T) => any)|string)[], reverse?: boolean): T[]; } /** @@ -879,7 +874,7 @@ declare module angular { // see http://docs.angularjs.org/api/ng.$parseProvider /////////////////////////////////////////////////////////////////////////// interface IParseService { - (expression: string): ICompiledExpression; + (expression: string, interceptorFn?: (value: any, scope: IScope, locals: any) => any, expensiveChecks?: boolean): ICompiledExpression; } interface IParseProvider { @@ -888,11 +883,32 @@ declare module angular { unwrapPromises(): boolean; unwrapPromises(value: boolean): IParseProvider; + + /** + * Configure $parse service to add literal values that will be present as literal at expressions. + * + * @param literalName Token for the literal value. The literal name value must be a valid literal name. + * @param literalValue Value for this literal. All literal values must be primitives or `undefined`. + **/ + addLiteral(literalName: string, literalValue: any): void; + + /** + * Allows defining the set of characters that are allowed in Angular expressions. The function identifierStart will get called to know if a given character is a valid character to be the first character for an identifier. The function identifierContinue will get called to know if a given character is a valid character to be a follow-up identifier character. The functions identifierStart and identifierContinue will receive as arguments the single character to be identifier and the character code point. These arguments will be string and numeric. Keep in mind that the string parameter can be two characters long depending on the character representation. It is expected for the function to return true or false, whether that character is allowed or not. + * Since this function will be called extensivelly, keep the implementation of these functions fast, as the performance of these functions have a direct impact on the expressions parsing speed. + * + * @param identifierStart The function that will decide whether the given character is a valid identifier start character. + * @param identifierContinue The function that will decide whether the given character is a valid identifier continue character. + **/ + setIdentifierFns(identifierStart?: (character: string, codePoint: number) => boolean, + identifierContinue?: (character: string, codePoint: number) => boolean): void; } interface ICompiledExpression { (context: any, locals?: any): any; + literal: boolean; + constant: boolean; + // If value is not provided, undefined is gonna be used since the implementation // does not check the parameter. Let's force a value for consistency. If consumer // whants to undefine it, pass the undefined value explicitly. @@ -970,7 +986,10 @@ declare module angular { // DocumentService // see http://docs.angularjs.org/api/ng.$document /////////////////////////////////////////////////////////////////////////// - interface IDocumentService extends IAugmentedJQuery {} + interface IDocumentService extends JQuery { + // Must return intersection type for index signature compatibility with JQuery + [index: number]: HTMLElement & Document; + } /////////////////////////////////////////////////////////////////////////// // ExceptionHandlerService @@ -996,9 +1015,10 @@ declare module angular { * See http://docs.angularjs.org/api/ng/service/$q */ interface IQService { - new (resolver: (resolve: IQResolveReject<any>) => any): IPromise<any>; - new (resolver: (resolve: IQResolveReject<any>, reject: IQResolveReject<any>) => any): IPromise<any>; + new <T>(resolver: (resolve: IQResolveReject<T>) => any): IPromise<T>; new <T>(resolver: (resolve: IQResolveReject<T>, reject: IQResolveReject<any>) => any): IPromise<T>; + <T>(resolver: (resolve: IQResolveReject<T>) => any): IPromise<T>; + <T>(resolver: (resolve: IQResolveReject<T>, reject: IQResolveReject<any>) => any): IPromise<T>; /** * Combines multiple promises into a single promise that is resolved when all of the input promises are resolved. @@ -1007,7 +1027,16 @@ declare module angular { * * @param promises An array of promises. */ - all(promises: IPromise<any>[]): IPromise<any[]>; + all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>, T6 | IPromise<T6>, T7 | IPromise<T7>, T8 | IPromise<T8>, T9 | IPromise<T9>, T10 | IPromise<T10>]): IPromise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>; + all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>, T6 | IPromise<T6>, T7 | IPromise<T7>, T8 | IPromise<T8>, T9 | IPromise<T9>]): IPromise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>; + all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>, T6 | IPromise<T6>, T7 | IPromise<T7>, T8 | IPromise<T8>]): IPromise<[T1, T2, T3, T4, T5, T6, T7, T8]>; + all<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>, T6 | IPromise<T6>, T7 | IPromise<T7>]): IPromise<[T1, T2, T3, T4, T5, T6, T7]>; + all<T1, T2, T3, T4, T5, T6>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>, T6 | IPromise<T6>]): IPromise<[T1, T2, T3, T4, T5, T6]>; + all<T1, T2, T3, T4, T5>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>, T5 | IPromise<T5>]): IPromise<[T1, T2, T3, T4, T5]>; + all<T1, T2, T3, T4>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>, T4 | IPromise <T4>]): IPromise<[T1, T2, T3, T4]>; + all<T1, T2, T3>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>, T3 | IPromise<T3>]): IPromise<[T1, T2, T3]>; + all<T1, T2>(values: [T1 | IPromise<T1>, T2 | IPromise<T2>]): IPromise<[T1, T2]>; + all<TAll>(promises: IPromise<TAll>[]): IPromise<TAll[]>; /** * Combines multiple promises into a single promise that is resolved when all of the input promises are resolved. * @@ -1016,6 +1045,7 @@ declare module angular { * @param promises A hash of promises. */ all(promises: { [id: string]: IPromise<any>; }): IPromise<{ [id: string]: any; }>; + all<T extends {}>(promises: { [id: string]: IPromise<any>; }): IPromise<T>; /** * Creates a Deferred object which represents a task which will finish in the future. */ @@ -1033,12 +1063,20 @@ declare module angular { * * @param value Value or a promise */ - when<T>(value: IPromise<T>|T): IPromise<T>; + resolve<T>(value: IPromise<T>|T): IPromise<T>; + /** + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. This is useful when you are dealing with an object that might or might not be a promise, or if the promise comes from a source that can't be trusted. + */ + resolve(): IPromise<void>; /** * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. This is useful when you are dealing with an object that might or might not be a promise, or if the promise comes from a source that can't be trusted. * * @param value Value or a promise */ + when<T>(value: IPromise<T>|T): IPromise<T>; + /** + * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise. This is useful when you are dealing with an object that might or might not be a promise, or if the promise comes from a source that can't be trusted. + */ when(): IPromise<void>; } @@ -1048,23 +1086,23 @@ declare module angular { * The successCallBack may return IPromise<void> for when a $q.reject() needs to be returned * This method returns a new promise which is resolved or rejected via the return value of the successCallback, errorCallback. It also notifies via the return value of the notifyCallback method. The promise can not be resolved or rejected from the notifyCallback method. */ - then<TResult>(successCallback: (promiseValue: T) => IHttpPromise<TResult>|IPromise<TResult>|TResult|IPromise<void>, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>; + then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>; /** * Shorthand for promise.then(null, errorCallback) */ - catch<TResult>(onRejected: (reason: any) => IHttpPromise<TResult>|IPromise<TResult>|TResult): IPromise<TResult>; + catch<TResult>(onRejected: (reason: any) => IPromise<TResult>|TResult): IPromise<TResult>; /** * Allows you to observe either the fulfillment or rejection of a promise, but to do so without modifying the final value. This is useful to release resources or do some clean-up that needs to be done whether the promise was rejected or resolved. See the full specification for more information. * * Because finally is a reserved word in JavaScript and reserved keywords are not supported as property names by ES3, you'll need to invoke the method like promise['finally'](callback) to make your code IE8 and Android 2.x compatible. */ - finally<TResult>(finallyCallback: () => any): IPromise<TResult>; + finally(finallyCallback: () => any): IPromise<T>; } interface IDeferred<T> { - resolve(value?: T): void; + resolve(value?: T|IPromise<T>): void; reject(reason?: any): void; notify(state?: any): void; promise: IPromise<T>; @@ -1156,7 +1194,7 @@ declare module angular { * * @param key the key of the data to be retrieved */ - get(key: string): any; + get<T>(key: string): T; /** * Removes an entry from the Cache object. @@ -1189,10 +1227,15 @@ declare module angular { interface ICompileProvider extends IServiceProvider { directive(name: string, directiveFactory: Function): ICompileProvider; + directive(directivesMap: Object, directiveFactory: Function): ICompileProvider; + directive(name: string, inlineAnnotatedFunction: any[]): ICompileProvider; + directive(directivesMap: Object, inlineAnnotatedFunction: any[]): ICompileProvider; // Undocumented, but it is there... directive(directivesMap: any): ICompileProvider; + component(name: string, options: IComponentOptions): ICompileProvider; + aHrefSanitizationWhitelist(): RegExp; aHrefSanitizationWhitelist(regexp: RegExp): ICompileProvider; @@ -1209,15 +1252,15 @@ declare module angular { // This corresponds to the "publicLinkFn" returned by $compile. interface ITemplateLinkingFunction { - (scope: IScope, cloneAttachFn?: ICloneAttachFunction): IAugmentedJQuery; + (scope: IScope, cloneAttachFn?: ICloneAttachFunction): JQuery; } // This corresponds to $transclude (and also the transclude function passed to link). interface ITranscludeFunction { // If the scope is provided, then the cloneAttachFn must be as well. - (scope: IScope, cloneAttachFn: ICloneAttachFunction): IAugmentedJQuery; + (scope: IScope, cloneAttachFn: ICloneAttachFunction): JQuery; // If one argument is provided, then it's assumed to be the cloneAttachFn. - (cloneAttachFn?: ICloneAttachFunction): IAugmentedJQuery; + (cloneAttachFn?: ICloneAttachFunction): JQuery; } /////////////////////////////////////////////////////////////////////////// @@ -1227,8 +1270,9 @@ declare module angular { /////////////////////////////////////////////////////////////////////////// interface IControllerService { // Although the documentation doesn't state this, locals are optional - (controllerConstructor: Function, locals?: any): any; - (controllerName: string, locals?: any): any; + <T>(controllerConstructor: new (...args: any[]) => T, locals?: any, later?: boolean, ident?: string): T; + <T>(controllerConstructor: Function, locals?: any, later?: boolean, ident?: string): T; + <T>(controllerName: string, locals?: any, later?: boolean, ident?: string): T; } interface IControllerProvider extends IServiceProvider { @@ -1237,6 +1281,15 @@ declare module angular { allowGlobals(): void; } + /** + * xhrFactory + * Replace or decorate this service to create your own custom XMLHttpRequest objects. + * see https://docs.angularjs.org/api/ng/service/$xhrFactory + */ + interface IXhrFactory<T> { + (method: string, url: string): T; + } + /** * HttpService * see http://docs.angularjs.org/api/ng/service/$http @@ -1309,51 +1362,25 @@ declare module angular { /** * Runtime equivalent of the $httpProvider.defaults property. Allows configuration of default headers, withCredentials as well as request and response transformations. */ - defaults: IRequestConfig; + defaults: IHttpProviderDefaults; /** * Array of config objects for currently pending requests. This is primarily meant to be used for debugging purposes. */ - pendingRequests: any[]; + pendingRequests: IRequestConfig[]; } /** * Object describing the request to be made and how it should be processed. * see http://docs.angularjs.org/api/ng/service/$http#usage */ - interface IRequestShortcutConfig { + interface IRequestShortcutConfig extends IHttpProviderDefaults { /** * {Object.<string|Object>} * Map of strings or objects which will be turned to ?key1=value1&key2=value2 after the url. If the value is not a string, it will be JSONified. */ params?: any; - /** - * Map of strings or functions which return strings representing HTTP headers to send to the server. If the return value of a function is null, the header will not be sent. - */ - headers?: any; - - /** - * Name of HTTP header to populate with the XSRF token. - */ - xsrfHeaderName?: string; - - /** - * Name of cookie containing the XSRF token. - */ - xsrfCookieName?: string; - - /** - * {boolean|Cache} - * If true, a default $http cache will be used to cache the GET request, otherwise if a cache instance built with $cacheFactory, this cache will be used for caching. - */ - cache?: any; - - /** - * whether to to set the withCredentials flag on the XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5 for more information. - */ - withCredentials?: boolean; - /** * {string|Object} * Data to be sent as the request message data. @@ -1361,25 +1388,12 @@ declare module angular { data?: any; /** - * {function(data, headersGetter)|Array.<function(data, headersGetter)>} - * Transform function or an array of such functions. The transform function takes the http request body and headers and returns its transformed (typically serialized) version. - */ - transformRequest?: any; - - /** - * {function(data, headersGetter)|Array.<function(data, headersGetter)>} - * Transform function or an array of such functions. The transform function takes the http response body and headers and returns its transformed (typically deserialized) version. - */ - transformResponse?: any; - - /** - * {number|Promise} * Timeout in milliseconds, or promise that should abort the request when resolved. */ - timeout?: any; + timeout?: number|IPromise<any>; /** - * See requestType. + * See [XMLHttpRequest.responseType]https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype */ responseType?: string; } @@ -1417,38 +1431,124 @@ declare module angular { } interface IHttpPromise<T> extends IPromise<IHttpPromiseCallbackArg<T>> { - success(callback: IHttpPromiseCallback<T>): IHttpPromise<T>; - error(callback: IHttpPromiseCallback<any>): IHttpPromise<T>; - then<TResult>(successCallback: (response: IHttpPromiseCallbackArg<T>) => IPromise<TResult>|TResult, errorCallback?: (response: IHttpPromiseCallbackArg<any>) => any): IPromise<TResult>; + /** + * The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. + * If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error. + * @deprecated + */ + success?(callback: IHttpPromiseCallback<T>): IHttpPromise<T>; + /** + * The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. + * If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error. + * @deprecated + */ + error?(callback: IHttpPromiseCallback<any>): IHttpPromise<T>; + } + + // See the jsdoc for transformData() at https://github.com/angular/angular.js/blob/master/src/ng/http.js#L228 + interface IHttpRequestTransformer { + (data: any, headersGetter: IHttpHeadersGetter): any; + } + + // The definition of fields are the same as IHttpPromiseCallbackArg + interface IHttpResponseTransformer { + (data: any, headersGetter: IHttpHeadersGetter, status: number): any; + } + + type HttpHeaderType = {[requestType: string]:string|((config:IRequestConfig) => string)}; + + interface IHttpRequestConfigHeaders { + [requestType: string]: any; + common?: any; + get?: any; + post?: any; + put?: any; + patch?: any; } /** - * Object that controls the defaults for $http provider + * Object that controls the defaults for $http provider. Not all fields of IRequestShortcutConfig can be configured + * via defaults and the docs do not say which. The following is based on the inspection of the source code. * https://docs.angularjs.org/api/ng/service/$http#defaults + * https://docs.angularjs.org/api/ng/service/$http#usage + * https://docs.angularjs.org/api/ng/provider/$httpProvider The properties section */ interface IHttpProviderDefaults { - cache?: boolean; + /** + * {boolean|Cache} + * If true, a default $http cache will be used to cache the GET request, otherwise if a cache instance built with $cacheFactory, this cache will be used for caching. + */ + cache?: any; + /** * Transform function or an array of such functions. The transform function takes the http request body and * headers and returns its transformed (typically serialized) version. + * @see {@link https://docs.angularjs.org/api/ng/service/$http#transforming-requests-and-responses} */ - transformRequest?: ((data: any, headersGetter?: any) => any)|((data: any, headersGetter?: any) => any)[]; - xsrfCookieName?: string; + transformRequest?: IHttpRequestTransformer |IHttpRequestTransformer[]; + + /** + * Transform function or an array of such functions. The transform function takes the http response body and + * headers and returns its transformed (typically deserialized) version. + */ + transformResponse?: IHttpResponseTransformer | IHttpResponseTransformer[]; + + /** + * Map of strings or functions which return strings representing HTTP headers to send to the server. If the + * return value of a function is null, the header will not be sent. + * The key of the map is the request verb in lower case. The "common" key applies to all requests. + * @see {@link https://docs.angularjs.org/api/ng/service/$http#setting-http-headers} + */ + headers?: IHttpRequestConfigHeaders; + + /** Name of HTTP header to populate with the XSRF token. */ xsrfHeaderName?: string; + + /** Name of cookie containing the XSRF token. */ + xsrfCookieName?: string; + + /** + * whether to to set the withCredentials flag on the XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5 for more information. + */ withCredentials?: boolean; - headers?: { - common?: any; - post?: any; - put?: any; - patch?: any; - } + + /** + * A function used to the prepare string representation of request parameters (specified as an object). If + * specified as string, it is interpreted as a function registered with the $injector. Defaults to + * $httpParamSerializer. + */ + paramSerializer?: string | ((obj: any) => string); + } + + interface IHttpInterceptor { + request?: (config: IRequestConfig) => IRequestConfig|IPromise<IRequestConfig>; + requestError?: (rejection: any) => any; + response?: <T>(response: IHttpPromiseCallbackArg<T>) => IPromise<IHttpPromiseCallbackArg<T>>|IHttpPromiseCallbackArg<T>; + responseError?: (rejection: any) => any; + } + + interface IHttpInterceptorFactory { + (...args: any[]): IHttpInterceptor; } interface IHttpProvider extends IServiceProvider { defaults: IHttpProviderDefaults; - interceptors: any[]; + + /** + * Register service factories (names or implementations) for interceptors which are called before and after + * each request. + */ + interceptors: (string|IHttpInterceptorFactory|(string|IHttpInterceptorFactory)[])[]; useApplyAsync(): boolean; useApplyAsync(value: boolean): IHttpProvider; + + /** + * + * @param {boolean=} value If true, `$http` will return a normal promise without the `success` and `error` methods. + * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining. + * otherwise, returns the current configured value. + */ + useLegacyPromiseExtensions(value:boolean) : boolean | IHttpProvider; } /////////////////////////////////////////////////////////////////////////// @@ -1540,6 +1640,8 @@ declare module angular { interface ISCEDelegateProvider extends IServiceProvider { resourceUrlBlacklist(blacklist: any[]): void; resourceUrlWhitelist(whitelist: any[]): void; + resourceUrlBlacklist(): any[]; + resourceUrlWhitelist(): any[]; } /** @@ -1570,6 +1672,107 @@ declare module angular { totalPendingRequests: number; } + /////////////////////////////////////////////////////////////////////////// + // Component + // see http://angularjs.blogspot.com.br/2015/11/angularjs-15-beta2-and-14-releases.html + // and http://toddmotto.com/exploring-the-angular-1-5-component-method/ + /////////////////////////////////////////////////////////////////////////// + /** + * Component definition object (a simplified directive definition object) + */ + interface IComponentOptions { + /** + * Controller constructor function that should be associated with newly created scope or the name of a registered + * controller if passed as a string. Empty function by default. + * Use the array form to define dependencies (necessary if strictDi is enabled and you require dependency injection) + */ + controller?: string | Function | (string | Function)[] | IComponentController; + /** + * An identifier name for a reference to the controller. If present, the controller will be published to scope under + * the controllerAs name. If not present, this will default to be the same as the component name. + * @default "$ctrl" + */ + controllerAs?: string; + /** + * html template as a string or a function that returns an html template as a string which should be used as the + * contents of this component. Empty string by default. + * If template is a function, then it is injected with the following locals: + * $element - Current element + * $attrs - Current attributes object for the element + * Use the array form to define dependencies (necessary if strictDi is enabled and you require dependency injection) + */ + template?: string | Function | (string | Function)[]; + /** + * path or function that returns a path to an html template that should be used as the contents of this component. + * If templateUrl is a function, then it is injected with the following locals: + * $element - Current element + * $attrs - Current attributes object for the element + * Use the array form to define dependencies (necessary if strictDi is enabled and you require dependency injection) + */ + templateUrl?: string | Function | (string | Function)[]; + /** + * Define DOM attribute binding to component properties. Component properties are always bound to the component + * controller and not to the scope. + */ + bindings?: {[binding: string]: string}; + /** + * Whether transclusion is enabled. Enabled by default. + */ + transclude?: boolean | string | {[slot: string]: string}; + /** + * Requires the controllers of other directives and binds them to this component's controller. + * The object keys specify the property names under which the required controllers (object values) will be bound. + * Note that the required controllers will not be available during the instantiation of the controller, + * but they are guaranteed to be available just before the $onInit method is executed! + */ + require?: {[controller: string]: string}; + } + + interface IComponentTemplateFn { + ( $element?: JQuery, $attrs?: IAttributes ): string; + } + + /** + * Components have a well-defined lifecycle Each component can implement "lifecycle hooks". These are methods that + * will be called at certain points in the life of the component. + * @url https://docs.angularjs.org/guide/component + */ + interface IComponentController { + /** + * Called on each controller after all the controllers on an element have been constructed and had their bindings + * initialized (and before the pre & post linking functions for the directives on this element). This is a good + * place to put initialization code for your controller. + */ + $onInit?(): void; + /** + * Called whenever one-way bindings are updated. The changesObj is a hash whose keys are the names of the bound + * properties that have changed, and the values are an {@link IChangesObject} object of the form + * { currentValue, previousValue, isFirstChange() }. Use this hook to trigger updates within a component such as + * cloning the bound value to prevent accidental mutation of the outer value. + */ + $onChanges?(changesObj: {[property:string]: IChangesObject}): void; + /** + * Called on a controller when its containing scope is destroyed. Use this hook for releasing external resources, + * watches and event handlers. + */ + $onDestroy?(): void; + /** + * Called after this controller's element and its children have been linked. Similar to the post-link function this + * hook can be used to set up DOM event handlers and do direct DOM manipulation. Note that child elements that contain + * templateUrl directives will not have been compiled and linked since they are waiting for their template to load + * asynchronously and their own compilation and linking has been suspended until that occurs. This hook can be considered + * analogous to the ngAfterViewInit and ngAfterContentInit hooks in Angular 2. Since the compilation process is rather + * different in Angular 1 there is no direct mapping and care should be taken when upgrading. + */ + $postLink?(): void; + } + + interface IChangesObject { + currentValue: any; + previousValue: any; + isFirstChange(): boolean; + } + /////////////////////////////////////////////////////////////////////////// // Directive // see http://docs.angularjs.org/api/ng.$compileProvider#directive @@ -1583,9 +1786,9 @@ declare module angular { interface IDirectiveLinkFn { ( scope: IScope, - instanceElement: IAugmentedJQuery, + instanceElement: JQuery, instanceAttributes: IAttributes, - controller: any, + controller: {}, transclude: ITranscludeFunction ): void; } @@ -1597,76 +1800,56 @@ declare module angular { interface IDirectiveCompileFn { ( - templateElement: IAugmentedJQuery, + templateElement: JQuery, templateAttributes: IAttributes, + /** + * @deprecated + * Note: The transclude function that is passed to the compile function is deprecated, + * as it e.g. does not know about the right outer scope. Please use the transclude function + * that is passed to the link function instead. + */ transclude: ITranscludeFunction - ): IDirectivePrePost; + ): void | IDirectivePrePost; } interface IDirective { compile?: IDirectiveCompileFn; controller?: any; controllerAs?: string; - bindToController?: boolean|Object; + /** + * @deprecated + * Deprecation warning: although bindings for non-ES6 class controllers are currently bound to this before + * the controller constructor is called, this use is now deprecated. Please place initialization code that + * relies upon bindings inside a $onInit method on the controller, instead. + */ + bindToController?: boolean | Object; link?: IDirectiveLinkFn | IDirectivePrePost; + multiElement?: boolean; name?: string; priority?: number; + /** + * @deprecated + */ replace?: boolean; - require?: any; + require?: string | string[] | {[controller: string]: string}; restrict?: string; - scope?: any; - template?: any; - templateUrl?: any; + scope?: boolean | Object; + template?: string | Function; + templateNamespace?: string; + templateUrl?: string | Function; terminal?: boolean; - transclude?: any; + transclude?: boolean | string | {[slot: string]: string}; } /** - * angular.element - * when calling angular.element, angular returns a jQuery object, - * augmented with additional methods like e.g. scope. - * see: http://docs.angularjs.org/api/angular.element + * These interfaces are kept for compatibility with older versions of these type definitions. + * Actually, Angular doesn't create a special subclass of jQuery objects. It extends jQuery.prototype + * like jQuery plugins do, that's why all jQuery objects have these Angular-specific methods, not + * only those returned from angular.element. + * See: http://docs.angularjs.org/api/angular.element */ - interface IAugmentedJQueryStatic extends JQueryStatic { - (selector: string, context?: any): IAugmentedJQuery; - (element: Element): IAugmentedJQuery; - (object: {}): IAugmentedJQuery; - (elementArray: Element[]): IAugmentedJQuery; - (object: JQuery): IAugmentedJQuery; - (func: Function): IAugmentedJQuery; - (array: any[]): IAugmentedJQuery; - (): IAugmentedJQuery; - } - - interface IAugmentedJQuery extends JQuery { - // TODO: events, how to define? - //$destroy - - find(selector: string): IAugmentedJQuery; - find(element: any): IAugmentedJQuery; - find(obj: JQuery): IAugmentedJQuery; - controller(): any; - controller(name: string): any; - injector(): any; - scope(): IScope; - isolateScope(): IScope; - - inheritedData(key: string, value: any): JQuery; - inheritedData(obj: { [key: string]: any; }): JQuery; - inheritedData(key?: string): any; - } - - /////////////////////////////////////////////////////////////////////// - // AnimateService - // see http://docs.angularjs.org/api/ng.$animate - /////////////////////////////////////////////////////////////////////// - interface IAnimateService { - addClass(element: JQuery, className: string, done?: Function): IPromise<any>; - enter(element: JQuery, parent: JQuery, after: JQuery, done?: Function): void; - leave(element: JQuery, done?: Function): void; - move(element: JQuery, parent: JQuery, after: JQuery, done?: Function): void; - removeClass(element: JQuery, className: string, done?: Function): void; - } + interface IAugmentedJQueryStatic extends JQueryStatic {} + interface IAugmentedJQuery extends JQuery {} /////////////////////////////////////////////////////////////////////////// // AUTO module (angular.js) @@ -1678,13 +1861,41 @@ declare module angular { // see http://docs.angularjs.org/api/AUTO.$injector /////////////////////////////////////////////////////////////////////// interface IInjectorService { - annotate(fn: Function): string[]; + annotate(fn: Function, strictDi?: boolean): string[]; annotate(inlineAnnotatedFunction: any[]): string[]; - get(name: string): any; + get<T>(name: string, caller?: string): T; + get(name: '$anchorScroll'): IAnchorScrollService + get(name: '$cacheFactory'): ICacheFactoryService + get(name: '$compile'): ICompileService + get(name: '$controller'): IControllerService + get(name: '$document'): IDocumentService + get(name: '$exceptionHandler'): IExceptionHandlerService + get(name: '$filter'): IFilterService + get(name: '$http'): IHttpService + get(name: '$httpBackend'): IHttpBackendService + get(name: '$httpParamSerializer'): IHttpParamSerializer + get(name: '$httpParamSerializerJQLike'): IHttpParamSerializer + get(name: '$interpolate'): IInterpolateService + get(name: '$interval'): IIntervalService + get(name: '$locale'): ILocaleService + get(name: '$location'): ILocationService + get(name: '$log'): ILogService + get(name: '$parse'): IParseService + get(name: '$q'): IQService + get(name: '$rootElement'): IRootElementService + get(name: '$rootScope'): IRootScopeService + get(name: '$sce'): ISCEService + get(name: '$sceDelegate'): ISCEDelegateService + get(name: '$templateCache'): ITemplateCacheService + get(name: '$templateRequest'): ITemplateRequestService + get(name: '$timeout'): ITimeoutService + get(name: '$window'): IWindowService + get<T>(name: '$xhrFactory'): IXhrFactory<T> has(name: string): boolean; - instantiate(typeConstructor: Function, locals?: any): any; + instantiate<T>(typeConstructor: Function, locals?: any): T; invoke(inlineAnnotatedFunction: any[]): any; invoke(func: Function, context?: any, locals?: any): any; + strictDi: boolean; } /////////////////////////////////////////////////////////////////////// @@ -1726,8 +1937,34 @@ declare module angular { provider(name: string, provider: IServiceProvider): IServiceProvider; provider(name: string, serviceProviderConstructor: Function): IServiceProvider; service(name: string, constructor: Function): IServiceProvider; + service(name: string, inlineAnnotatedFunction: any[]): IServiceProvider; value(name: string, value: any): IServiceProvider; } } + + /** + * $http params serializer that converts objects to strings + * see https://docs.angularjs.org/api/ng/service/$httpParamSerializer + */ + interface IHttpParamSerializer { + (obj: Object): string; + } +} + +interface JQuery { + // TODO: events, how to define? + //$destroy + + find(element: any): JQuery; + find(obj: JQuery): JQuery; + controller(name?: string): any; + injector(): ng.auto.IInjectorService; + /** It's declared generic for custom scope interfaces */ + scope<T extends ng.IScope>(): T; + isolateScope<T extends ng.IScope>(): T; + + inheritedData(key: string, value: any): JQuery; + inheritedData(obj: { [key: string]: any; }): JQuery; + inheritedData(key?: string): any; } diff --git a/Scripts/typings/jquery/jquery.d.ts b/Scripts/typings/jquery/jquery.d.ts index dc5c4ebb68..0f72c709cf 100644 --- a/Scripts/typings/jquery/jquery.d.ts +++ b/Scripts/typings/jquery/jquery.d.ts @@ -1,7 +1,7 @@ // Type definitions for jQuery 1.10.x / 2.0.x // Project: http://jquery.com/ // Definitions by: Boris Yankov <https://github.com/borisyankov/>, Christian Hoffmeister <https://github.com/choffmeister>, Steve Fenton <https://github.com/Steve-Fenton>, Diullei Gomes <https://github.com/Diullei>, Tass Iliopoulos <https://github.com/tasoili>, Jason Swearingen <https://github.com/jasons-novaleaf>, Sean Hill <https://github.com/seanski>, Guus Goossens <https://github.com/Guuz>, Kelly Summerlin <https://github.com/ksummerlin>, Basarat Ali Syed <https://github.com/basarat>, Nicholas Wolverson <https://github.com/nwolverson>, Derek Cicerone <https://github.com/derekcicerone>, Andrew Gaspar <https://github.com/AndrewGaspar>, James Harrison Fisher <https://github.com/jameshfisher>, Seikichi Kondo <https://github.com/seikichi>, Benjamin Jackman <https://github.com/benjaminjackman>, Poul Sorensen <https://github.com/s093294>, Josh Strobl <https://github.com/JoshStrobl>, John Reilly <https://github.com/johnnyreilly/>, Dick van den Brink <https://github.com/DickvdBrink> -// Definitions: https://github.com/borisyankov/DefinitelyTyped +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped /* ***************************************************************************** Copyright (c) Microsoft Corporation. All rights reserved. @@ -48,7 +48,7 @@ interface JQueryAjaxSettings { */ contents?: { [key: string]: any; }; //According to jQuery.ajax source code, ajax's option actually allows contentType to set to "false" - // https://github.com/borisyankov/DefinitelyTyped/issues/742 + // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/742 /** * When sending data to the server, use this content type. Default is "application/x-www-form-urlencoded; charset=UTF-8", which is fine for most cases. If you explicitly pass in a content-type to $.ajax(), then it is always sent to the server (even if no data is sent). The W3C XMLHttpRequest specification dictates that the charset is always UTF-8; specifying another charset will not force the browser to change the encoding. */ @@ -180,11 +180,15 @@ interface JQueryXHR extends XMLHttpRequest, JQueryPromise<any> { /** * Incorporates the functionality of the .done() and .fail() methods, allowing (as of jQuery 1.8) the underlying Promise to be manipulated. Refer to deferred.then() for implementation details. */ - then(doneCallback: (data: any, textStatus: string, jqXHR: JQueryXHR) => void, failCallback?: (jqXHR: JQueryXHR, textStatus: string, errorThrown: any) => void): JQueryPromise<any>; + then<R>(doneCallback: (data: any, textStatus: string, jqXHR: JQueryXHR) => R, failCallback?: (jqXHR: JQueryXHR, textStatus: string, errorThrown: any) => void): JQueryPromise<R>; /** * Property containing the parsed response if the response Content-Type is json */ responseJSON?: any; + /** + * A function to be called if the request fails. + */ + error(xhr: JQueryXHR, textStatus: string, errorThrown: string): void; } /** @@ -237,7 +241,7 @@ interface JQueryCallback { * @param context A reference to the context in which the callbacks in the list should be fired. * @param arguments An argument, or array of arguments, to pass to the callbacks in the list. */ - fireWith(context?: any, ...args: any[]): JQueryCallback; + fireWith(context?: any, args?: any[]): JQueryCallback; /** * Determine whether a supplied callback is in a list @@ -391,7 +395,7 @@ interface JQueryDeferred<T> extends JQueryGenericPromise<T> { * @param context Context passed to the progressCallbacks as the this object. * @param args Optional arguments that are passed to the progressCallbacks. */ - notifyWith(context: any, value?: any, ...args: any[]): JQueryDeferred<T>; + notifyWith(context: any, value?: any[]): JQueryDeferred<T>; /** * Reject a Deferred object and call any failCallbacks with the given args. @@ -405,7 +409,7 @@ interface JQueryDeferred<T> extends JQueryGenericPromise<T> { * @param context Context passed to the failCallbacks as the this object. * @param args An optional array of arguments that are passed to the failCallbacks. */ - rejectWith(context: any, value?: any, ...args: any[]): JQueryDeferred<T>; + rejectWith(context: any, value?: any[]): JQueryDeferred<T>; /** * Resolve a Deferred object and call any doneCallbacks with the given args. @@ -421,7 +425,7 @@ interface JQueryDeferred<T> extends JQueryGenericPromise<T> { * @param context Context passed to the doneCallbacks as the this object. * @param args An optional array of arguments that are passed to the doneCallbacks. */ - resolveWith(context: any, value?: T, ...args: any[]): JQueryDeferred<T>; + resolveWith(context: any, value?: T[]): JQueryDeferred<T>; /** * Return a Deferred's Promise object. @@ -438,6 +442,7 @@ interface JQueryDeferred<T> extends JQueryGenericPromise<T> { * Interface of the JQuery extension of the W3C event object */ interface BaseJQueryEventObject extends Event { + currentTarget: Element; data: any; delegateTarget: Element; isDefaultPrevented(): boolean; @@ -603,6 +608,16 @@ interface JQueryAnimationOptions { specialEasing?: Object; } +interface JQueryEasingFunction { + ( percent: number ): number; +} + +interface JQueryEasingFunctions { + [ name: string ]: JQueryEasingFunction; + linear: JQueryEasingFunction; + swing: JQueryEasingFunction; +} + /** * Static members of jQuery (those on $ and jQuery themselves) */ @@ -662,6 +677,12 @@ interface JQueryStatic { * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html). */ get(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR; + /** + * Load data from the server using a HTTP GET request. + * + * @param settings The JQueryAjaxSettings to be used for the request + */ + get(settings : JQueryAjaxSettings): JQueryXHR; /** * Load JSON-encoded data from the server using a GET HTTP request. * @@ -707,7 +728,12 @@ interface JQueryStatic { * @param dataType The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). */ post(url: string, data?: Object|string, success?: (data: any, textStatus: string, jqXHR: JQueryXHR) => any, dataType?: string): JQueryXHR; - + /** + * Load data from the server using a HTTP POST request. + * + * @param settings The JQueryAjaxSettings to be used for the request + */ + post(settings : JQueryAjaxSettings): JQueryXHR; /** * A multi-purpose callbacks list object that provides a powerful way to manage callback lists. * @@ -791,7 +817,7 @@ interface JQueryStatic { * * @param removeAll A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself). */ - noConflict(removeAll?: boolean): Object; + noConflict(removeAll?: boolean): JQueryStatic; /** * Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events. @@ -885,6 +911,9 @@ interface JQueryStatic { /** * Effects */ + + easing: JQueryEasingFunctions; + fx: { tick: () => void; /** @@ -996,7 +1025,7 @@ interface JQueryStatic { * @param func The function to process each item against. The first argument to the function is the item, and the second argument is the index. The function should return a Boolean value. this will be the global window object. * @param invert If "invert" is false, or not provided, then the function returns an array consisting of all elements for which "callback" returns true. If "invert" is true, then the function returns an array consisting of all elements for which "callback" returns false. */ - grep<T>(array: T[], func: (elementOfArray: T, indexInArray: number) => boolean, invert?: boolean): T[]; + grep<T>(array: T[], func: (elementOfArray?: T, indexInArray?: number) => boolean, invert?: boolean): T[]; /** * Search for a specified value within an array and return its index (or -1 if not found). @@ -1063,14 +1092,14 @@ interface JQueryStatic { * @param array The Array to translate. * @param callback The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object. */ - map<T, U>(array: T[], callback: (elementOfArray: T, indexInArray: number) => U): U[]; + map<T, U>(array: T[], callback: (elementOfArray?: T, indexInArray?: number) => U): U[]; /** * Translate all items in an array or object to new array of items. * * @param arrayOrObject The Array or Object to translate. * @param callback The function to process each item against. The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object. */ - map(arrayOrObject: any, callback: (value: any, indexOrKey: any) => any): any; + map(arrayOrObject: any, callback: (value?: any, indexOrKey?: any) => any): any; /** * Merge the contents of two arrays together into the first array. @@ -1359,9 +1388,9 @@ interface JQuery { /** * Set the value of each element in the set of matched elements. * - * @param value A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked. + * @param value A string of text, an array of strings or number corresponding to the value of each matched element to set as selected/checked. */ - val(value: string|string[]): JQuery; + val(value: string|string[]|number): JQuery; /** * Set the value of each element in the set of matched elements. * @@ -1541,18 +1570,18 @@ interface JQuery { * @param value The new data value; it can be any Javascript type including Array or Object. */ data(key: string, value: any): JQuery; - /** - * Store arbitrary data associated with the matched elements. - * - * @param obj An object of key-value pairs of data to update. - */ - data(obj: { [key: string]: any; }): JQuery; /** * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. * * @param key Name of the data stored. */ data(key: string): any; + /** + * Store arbitrary data associated with the matched elements. + * + * @param obj An object of key-value pairs of data to update. + */ + data(obj: { [key: string]: any; }): JQuery; /** * Return the value at the named data store for the first element in the jQuery collection, as set by data(name, value) or by an HTML5 data-* attribute. */ @@ -1577,6 +1606,10 @@ interface JQuery { * @param list An array of strings naming the pieces of data to delete. */ removeData(list: string[]): JQuery; + /** + * Remove all previously-stored piece of data. + */ + removeData(): JQuery; /** * Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. @@ -1955,6 +1988,24 @@ interface JQuery { */ click(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery; + /** + * Trigger the "contextmenu" event on an element. + */ + contextmenu(): JQuery; + /** + * Bind an event handler to the "contextmenu" JavaScript event. + * + * @param handler A function to execute when the event is triggered. + */ + contextmenu(handler: (eventObject: JQueryMouseEventObject) => any): JQuery; + /** + * Bind an event handler to the "contextmenu" JavaScript event. + * + * @param eventData An object containing data that will be passed to the event handler. + * @param handler A function to execute when the event is triggered. + */ + contextmenu(eventData: Object, handler: (eventObject: JQueryMouseEventObject) => any): JQuery; + /** * Trigger the "dblclick" event on an element. */ @@ -1994,6 +2045,10 @@ interface JQuery { */ focus(eventData?: any, handler?: (eventObject: JQueryEventObject) => any): JQuery; + /** + * Trigger the "focusin" event on an element. + */ + focusin(): JQuery; /** * Bind an event handler to the "focusin" JavaScript event * @@ -2008,6 +2063,10 @@ interface JQuery { */ focusin(eventData: Object, handler: (eventObject: JQueryEventObject) => any): JQuery; + /** + * Trigger the "focusout" event on an element. + */ + focusout(): JQuery; /** * Bind an event handler to the "focusout" JavaScript event * @@ -2242,6 +2301,13 @@ interface JQuery { * @param handler A handler function previously attached for the event(s), or the special value false. */ off(events: string, selector?: string, handler?: (eventObject: JQueryEventObject) => any): JQuery; + /** + * Remove an event handler. + * + * @param events One or more space-separated event types and optional namespaces, or just namespaces, such as "click", "keydown.myPlugin", or ".myPlugin". + * @param handler A handler function previously attached for the event(s), or the special value false. Takes handler with extra args that can be attached with on(). + */ + off(events: string, handler: (eventObject: JQueryEventObject, ...args: any[]) => any): JQuery; /** * Remove an event handler. * @@ -2567,10 +2633,10 @@ interface JQuery { /** * Insert content, specified by the parameter, after each element in the set of matched elements. * - * param content1 HTML string, DOM element, array of elements, or jQuery object to insert after each element in the set of matched elements. + * param content1 HTML string, DOM element, DocumentFragment, array of elements, or jQuery object to insert after each element in the set of matched elements. * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements. */ - after(content1: JQuery|any[]|Element|Text|string, ...content2: any[]): JQuery; + after(content1: JQuery|any[]|Element|DocumentFragment|Text|string, ...content2: any[]): JQuery; /** * Insert content, specified by the parameter, after each element in the set of matched elements. * @@ -2581,10 +2647,10 @@ interface JQuery { /** * Insert content, specified by the parameter, to the end of each element in the set of matched elements. * - * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements. + * param content1 DOM element, DocumentFragment, array of elements, HTML string, or jQuery object to insert at the end of each element in the set of matched elements. * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements. */ - append(content1: JQuery|any[]|Element|Text|string, ...content2: any[]): JQuery; + append(content1: JQuery|any[]|Element|DocumentFragment|Text|string, ...content2: any[]): JQuery; /** * Insert content, specified by the parameter, to the end of each element in the set of matched elements. * @@ -2602,10 +2668,10 @@ interface JQuery { /** * Insert content, specified by the parameter, before each element in the set of matched elements. * - * param content1 HTML string, DOM element, array of elements, or jQuery object to insert before each element in the set of matched elements. + * param content1 HTML string, DOM element, DocumentFragment, array of elements, or jQuery object to insert before each element in the set of matched elements. * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements. */ - before(content1: JQuery|any[]|Element|Text|string, ...content2: any[]): JQuery; + before(content1: JQuery|any[]|Element|DocumentFragment|Text|string, ...content2: any[]): JQuery; /** * Insert content, specified by the parameter, before each element in the set of matched elements. * @@ -2650,10 +2716,10 @@ interface JQuery { /** * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. * - * param content1 DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements. + * param content1 DOM element, DocumentFragment, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements. * param content2 One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements. */ - prepend(content1: JQuery|any[]|Element|Text|string, ...content2: any[]): JQuery; + prepend(content1: JQuery|any[]|Element|DocumentFragment|Text|string, ...content2: any[]): JQuery; /** * Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. * @@ -3034,7 +3100,7 @@ interface JQuery { * * @param elements One or more DOM elements to remove from the matched set. */ - not(...elements: Element[]): JQuery; + not(elements: Element|Element[]): JQuery; /** * Remove elements from the set of matched elements. * diff --git a/Scripts/typings/tsd.d.ts b/Scripts/typings/tsd.d.ts index d94976cbd6..b6384be638 100644 --- a/Scripts/typings/tsd.d.ts +++ b/Scripts/typings/tsd.d.ts @@ -5,4 +5,4 @@ /// <reference path="underscore/underscore.d.ts" /> /// <reference path="pusher-js/pusher-js.d.ts" /> /// <reference path="bootstrap-switch/bootstrap-switch.d.ts" /> -/// <reference path="angular-ui-bootstrap.d.ts" /> \ No newline at end of file +/// <reference path="angular-material/angular-material.d.ts" /> \ No newline at end of file diff --git a/Services/PlanDirectory/App_Start/RouteConfig.cs b/Services/PlanDirectory/App_Start/RouteConfig.cs deleted file mode 100644 index 50fa7ac51d..0000000000 --- a/Services/PlanDirectory/App_Start/RouteConfig.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Web.Mvc; -using System.Web.Routing; - -namespace PlanDirectory -{ - public class RouteConfig - { - public static void RegisterRoutes(RouteCollection routes) - { - routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); - routes.IgnoreRoute("{*html}", new { html = @".*\.html" }); - - routes.MapRoute( - name: "Reauthenticate", - url: "Reauthenticate", - defaults: new { controller = "Home", action = "Reauthenticate" } - ); - - routes.MapRoute( - name: "AuthenticateByToken", - url: "AuthenticateByToken", - defaults: new { controller = "Home", action = "AuthenticateByToken" } - ); - - routes.MapRoute( - name: "AngularTemplates", - url: "AngularTemplate/{template}", - defaults: new { controller = "AngularTemplate", action = "Markup" } - ); - - routes.MapRoute( - name: "Default", - url: "{controller}/{action}/{id}", - defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } - ); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/App_Start/WebApiConfig.cs b/Services/PlanDirectory/App_Start/WebApiConfig.cs deleted file mode 100644 index bf20c9e1b6..0000000000 --- a/Services/PlanDirectory/App_Start/WebApiConfig.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Net.Http; -using System.Web.Http; -using System.Web.Http.Routing; -using System.Web.Http.Dispatcher; -using Hub.Infrastructure; - -namespace PlanDirectory -{ - public static class WebApiConfig - { - public static void Register(HttpConfiguration config) - { - // Web API configuration and services - config.Services.Replace(typeof(IHttpControllerSelector), new CustomSelector(config)); - - config.Routes.MapHttpRoute( - name : "DefaultApiWithAction", - routeTemplate : "api/{controller}/{action}/{id}", - defaults : new { id = RouteParameter.Optional } - ); - - config.Routes.MapHttpRoute( - name: "DefaultApiGet", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional, action = "Get" }, - constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) } - ); - - config.Routes.MapHttpRoute( - name: "DefaultApiPost", - routeTemplate: "api/{controller}", - defaults: new { action = "Post" }, - constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) } - ); - - config.Routes.MapHttpRoute( - name: "DefaultApiPut", - routeTemplate: "api/{controller}", - defaults: new { action = "Put" }, - constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Put) } - ); - - config.Routes.MapHttpRoute( - name: "DefaultApiDelete", - routeTemplate: "api/{controller}/{id}", - defaults: new { id = RouteParameter.Optional, action = "Delete" }, - constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Delete) } - ); - - config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; - - HttpConfiguration config1 = GlobalConfiguration.Configuration; - config.Formatters.JsonFormatter.SerializerSettings.Formatting = - Newtonsoft.Json.Formatting.Indented; - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Category/built-in services.html b/Services/PlanDirectory/Category/built-in services.html deleted file mode 100644 index 0b7ef58904..0000000000 --- a/Services/PlanDirectory/Category/built-in services.html +++ /dev/null @@ -1,52 +0,0 @@ -<!DOCTYPE html> -<html> -<head> - <link rel="stylesheet" href="../bower_components/bootstrap/dist/css/bootstrap.min.css"/> - <link rel="stylesheet" href="../Content/metronic/components.css"/> - - <link href='https://fonts.googleapis.com/css?family=Francois+One' rel='stylesheet' type='text/css'> - <link href='https://fonts.googleapis.com/css?family=Didact+Gothic' rel='stylesheet' type='text/css'> - - <link rel="stylesheet" href="../Content/css/plan-category.css" /> - <link rel="stylesheet" href="../Content/css/plan-directory.css" /> - - <title> - - - -
- -
-
-
-

Plan Directory - built-in services.html

-
- - -
-
-

Plan Definition Description

-

Related Plans

- - - - - - - - - - - - - - - - - - -
#Plan NamePlan DescriptionAction
1Untitled Plan 5Untitled Plan 5Create
-
- - diff --git a/Services/PlanDirectory/CategoryPages/built-in services-slack.html b/Services/PlanDirectory/CategoryPages/built-in services-slack.html deleted file mode 100644 index f5f7faf28a..0000000000 --- a/Services/PlanDirectory/CategoryPages/built-in services-slack.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - -
- -
- -
-

Plan Directory - built-in services-slack.html

-
- - - - - -
-
-

Plan Definition Description

-

Related Plans

- - - - - - - - - - - - - - - - - - -
#Plan NamePlan DescriptionAction
1Core+SlackCore+SlackCreate
-
- - diff --git a/Services/PlanDirectory/CategoryPages/built-in services.html b/Services/PlanDirectory/CategoryPages/built-in services.html deleted file mode 100644 index 8525984b03..0000000000 --- a/Services/PlanDirectory/CategoryPages/built-in services.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - -
- -
- -
-

Plan Directory - built-in services.html

-
- - -
-
-

Plan Definition Description

-

Related Plans

- - - - - - - - - - - - - - - - - - -
#Plan NamePlan DescriptionAction
1Core+SlackCore+SlackCreate
-
- - diff --git a/Services/PlanDirectory/CategoryPages/slack.html b/Services/PlanDirectory/CategoryPages/slack.html deleted file mode 100644 index 43ee029562..0000000000 --- a/Services/PlanDirectory/CategoryPages/slack.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - -
- -
- -
-

Plan Directory - slack.html

-
- - -
-
-

Plan Definition Description

-

Related Plans

- - - - - - - - - - - - - - - - - - - - - - - - -
#Plan NamePlan DescriptionAction
1Slack+SlackSlack+SlackCreate
2Core+SlackCore+SlackCreate
-
- - diff --git a/Services/PlanDirectory/Config/PlanDirectory/Settings.config.readme b/Services/PlanDirectory/Config/PlanDirectory/Settings.config.readme deleted file mode 100644 index 4c31fe5fc5..0000000000 --- a/Services/PlanDirectory/Config/PlanDirectory/Settings.config.readme +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/font-awesome.css b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/font-awesome.css deleted file mode 100644 index 3d920fc87c..0000000000 --- a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/font-awesome.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.1.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-square:before,.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"} \ No newline at end of file diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/style.css b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/style.css deleted file mode 100644 index 37ee8c086b..0000000000 --- a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/css/style.css +++ /dev/null @@ -1,5 +0,0 @@ -.sign-signup { - margin-top: 12px; - margin-right: 20px; -} - diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/FontAwesome.otf b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/FontAwesome.otf deleted file mode 100644 index 3461e3fce6..0000000000 Binary files a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/FontAwesome.otf and /dev/null differ diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.eot b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.eot deleted file mode 100644 index 6cfd566095..0000000000 Binary files a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.svg b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.svg deleted file mode 100644 index a9f8469503..0000000000 --- a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,504 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.ttf b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.ttf deleted file mode 100644 index 5cd6cff6d6..0000000000 Binary files a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.woff b/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.woff deleted file mode 100644 index 9eaecb3799..0000000000 Binary files a/Services/PlanDirectory/Content/css/additionalcss/font-awesome/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/Box-logo_64x64.png b/Services/PlanDirectory/Content/icons/web_services/Box-logo_64x64.png deleted file mode 100644 index 025366aed4..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/Box-logo_64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/DocuSign-Logo.png b/Services/PlanDirectory/Content/icons/web_services/DocuSign-Logo.png deleted file mode 100644 index 413f775996..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/DocuSign-Logo.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/aws-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/aws-icon-64x64.png deleted file mode 100644 index d8616b2fe1..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/aws-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/basecamp2-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/basecamp2-icon-64x64.png deleted file mode 100644 index 9580a2170f..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/basecamp2-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/docusign-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/docusign-icon-64x64.png deleted file mode 100644 index 05e8c1c02f..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/docusign-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/dropbox-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/dropbox-icon-64x64.png deleted file mode 100644 index c3cdc6e673..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/dropbox-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/facebook-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/facebook-icon-64x64.png deleted file mode 100644 index 48a3ba04be..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/facebook-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64-lower-case.png b/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64-lower-case.png deleted file mode 100644 index f6bbb909fc..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64-lower-case.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64.png deleted file mode 100644 index 543ffd8fc4..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/fr8-core-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/fr8-demo-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/fr8-demo-icon-64x64.png deleted file mode 100644 index 543ffd8fc4..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/fr8-demo-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/gmail-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/gmail-icon-64x64.png deleted file mode 100644 index ddb7d812f2..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/gmail-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/google-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/google-icon-64x64.png deleted file mode 100644 index cda82fff7d..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/google-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/jira-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/jira-icon-64x64.png deleted file mode 100644 index 2d7feacc2d..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/jira-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/ms-azure-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/ms-azure-icon-64x64.png deleted file mode 100644 index 200c337e69..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/ms-azure-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/ms-excel-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/ms-excel-icon-64x64.png deleted file mode 100644 index 373ad5741b..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/ms-excel-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/papertrail-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/papertrail-icon-64x64.png deleted file mode 100644 index de33786db8..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/papertrail-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/quickbooks-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/quickbooks-icon-64x64.png deleted file mode 100644 index 2099e5d276..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/quickbooks-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/salesforce-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/salesforce-icon-64x64.png deleted file mode 100644 index 4a0b8dbe41..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/salesforce-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/sendgrid-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/sendgrid-icon-64x64.png deleted file mode 100644 index f9aebdedd2..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/sendgrid-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/slack-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/slack-icon-64x64.png deleted file mode 100644 index cbcaf6f786..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/slack-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/statX-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/statX-icon-64x64.png deleted file mode 100644 index 962902f69a..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/statX-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/telegram-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/telegram-icon-64x64.png deleted file mode 100644 index 00e5664fcd..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/telegram-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/twilio-icon-64x64.png b/Services/PlanDirectory/Content/icons/web_services/twilio-icon-64x64.png deleted file mode 100644 index b4dde30409..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/twilio-icon-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/unknown-service.png b/Services/PlanDirectory/Content/icons/web_services/unknown-service.png deleted file mode 100644 index 7561e14183..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/unknown-service.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/icons/web_services/yammer-64x64.png b/Services/PlanDirectory/Content/icons/web_services/yammer-64x64.png deleted file mode 100644 index dbd732420b..0000000000 Binary files a/Services/PlanDirectory/Content/icons/web_services/yammer-64x64.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/img/dockyard_logo.png b/Services/PlanDirectory/Content/img/dockyard_logo.png deleted file mode 100644 index fda891aa85..0000000000 Binary files a/Services/PlanDirectory/Content/img/dockyard_logo.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/img/dockyard_logo_dark.png b/Services/PlanDirectory/Content/img/dockyard_logo_dark.png deleted file mode 100644 index 37149f1013..0000000000 Binary files a/Services/PlanDirectory/Content/img/dockyard_logo_dark.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/img/dockyard_logo_white.png b/Services/PlanDirectory/Content/img/dockyard_logo_white.png deleted file mode 100644 index c811373840..0000000000 Binary files a/Services/PlanDirectory/Content/img/dockyard_logo_white.png and /dev/null differ diff --git a/Services/PlanDirectory/Content/img/favicon.ico b/Services/PlanDirectory/Content/img/favicon.ico deleted file mode 100644 index 0e14a242b2..0000000000 Binary files a/Services/PlanDirectory/Content/img/favicon.ico and /dev/null differ diff --git a/Services/PlanDirectory/Controllers/AngularTemplateController.cs b/Services/PlanDirectory/Controllers/AngularTemplateController.cs deleted file mode 100644 index d70d77968c..0000000000 --- a/Services/PlanDirectory/Controllers/AngularTemplateController.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Web.Mvc; -using PlanDirectory.Infrastructure; - -namespace PlanDirectory.Controllers -{ - [PlanDirectoryAuthorize] - public class AngularTemplateController : Controller - { - public ActionResult Markup(string template) - { - try - { - return View(string.Format("~/Views/AngularTemplate/{0}.cshtml", template)); - } - catch - { - return HttpNotFound(); - } - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Controllers/Api/AuthenticationController.cs b/Services/PlanDirectory/Controllers/Api/AuthenticationController.cs deleted file mode 100644 index 41cccb3ef9..0000000000 --- a/Services/PlanDirectory/Controllers/Api/AuthenticationController.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; -using System.Net; -using System.Net.Http; -using System.Security.Claims; -using System.Web.Http; -using Microsoft.AspNet.Identity; -using Microsoft.Owin.Security; -using StructureMap; -using Data.Interfaces; -using Data.Infrastructure.StructureMap; -using Fr8.Infrastructure.Utilities; -using Fr8.Infrastructure.Utilities.Logging; -using Hub.Infrastructure; -using PlanDirectory.Infrastructure; -using PlanDirectory.Interfaces; - -namespace PlanDirectory.Controllers.Api -{ - public class AuthenticationController : ApiController - { - private readonly IAuthTokenManager _authTokenManager; - - - public AuthenticationController() - { - _authTokenManager = ObjectFactory.GetInstance(); - } - - [HttpPost] - public IHttpActionResult LogIn([FromUri]string username, [FromUri]string password) - { - Request.GetOwinContext().Authentication.SignOut(); - - using (IUnitOfWork uow = ObjectFactory.GetInstance()) - { - var fr8AccountDO = uow.UserRepository.FindOne(x => x.UserName == username); - if (fr8AccountDO != null) - { - var passwordHasher = new PasswordHasher(); - if (passwordHasher.VerifyHashedPassword(fr8AccountDO.PasswordHash, password) == - PasswordVerificationResult.Success) - { - var security = ObjectFactory.GetInstance(); - var identity = security.GetIdentity(uow, fr8AccountDO); - Request.GetOwinContext() - .Authentication - .SignIn( - new AuthenticationProperties - { - IsPersistent = true - }, - identity - ); - - return Ok(); - } - } - } - - return StatusCode(HttpStatusCode.Forbidden); - } - - [HttpPost] - [Fr8ApiAuthorize] - [PlanDirectoryHMACAuthenticate] - public IHttpActionResult Token() - { - var fr8UserId = User.Identity.GetUserId(); - - if (!fr8UserId.IsNullOrEmpty()) - { - var token = _authTokenManager.CreateToken(Guid.Parse(fr8UserId)); - - return Ok(new { token }); - } - return BadRequest("User is not authenticated"); - } - - [HttpGet] - [ActionName("is_authenticated")] - public IHttpActionResult IsAuthenicated() - { - var authenticated = User.Identity.IsAuthenticated; - return Ok(new { authenticated }); - } - - [HttpGet] - [ActionName("is_privileged")] - public IHttpActionResult IsPrivileged() - { - var identity = User.Identity as ClaimsIdentity; - if (identity == null) - { - return Ok(new { privileged = false }); - } - - var privileged = identity.HasClaim(ClaimsIdentity.DefaultRoleClaimType, "Admin"); - - return Ok(new { privileged }); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Controllers/HomeController.cs b/Services/PlanDirectory/Controllers/HomeController.cs deleted file mode 100644 index efbfe37b45..0000000000 --- a/Services/PlanDirectory/Controllers/HomeController.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Web; -using System.Web.Mvc; -using StructureMap; -using Data.Interfaces; -using Data.Infrastructure.StructureMap; -using PlanDirectory.Interfaces; - -namespace PlanDirectory.Controllers -{ - public class HomeController : Controller - { - private readonly IAuthTokenManager _authTokenManager; - - - public HomeController() - { - _authTokenManager = ObjectFactory.GetInstance(); - } - - [HttpGet] - public ActionResult Index() - { - return View(); - } - - [HttpGet] - public ActionResult AuthenticateByToken(string token) - { - try - { - var fr8AccountId = _authTokenManager.GetFr8AccountId(token); - if (!fr8AccountId.HasValue) - { - return Redirect(VirtualPathUtility.ToAbsolute("~/Reauthenticate")); - } - - using (var uow = ObjectFactory.GetInstance()) - { - var fr8AccountDO = uow.UserRepository.GetByKey(fr8AccountId.Value.ToString()); - - var securityServices = ObjectFactory.GetInstance(); - securityServices.Logout(); - securityServices.Login(uow, fr8AccountDO); - - return Redirect(VirtualPathUtility.ToAbsolute("~/")); - } - } - catch (System.Exception ex) - { - var sb = new System.Text.StringBuilder(); - - while (ex != null) - { - sb.AppendLine(ex.Message); - sb.AppendLine(ex.StackTrace); - - ex = ex.InnerException; - } - - return Content(sb.ToString()); - } - } - - [HttpGet] - public ActionResult Reauthenticate() - { - return View(); - } - } -} diff --git a/Services/PlanDirectory/Global.asax b/Services/PlanDirectory/Global.asax deleted file mode 100644 index 379b4d1a95..0000000000 --- a/Services/PlanDirectory/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="PlanDirectory.Global" Language="C#" %> diff --git a/Services/PlanDirectory/Global.asax.cs b/Services/PlanDirectory/Global.asax.cs deleted file mode 100644 index 19c0a3695a..0000000000 --- a/Services/PlanDirectory/Global.asax.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using System.Web.Http; -using System.Web.Routing; -using Segment; -using StructureMap; -using Data.Infrastructure.AutoMapper; -using Data.Interfaces; -using Fr8.Infrastructure.Data.Manifests; -using Hub.Services; -using PlanDirectory.Infrastructure; -using PlanDirectory.Interfaces; - -namespace PlanDirectory -{ - public class Global : System.Web.HttpApplication - { - protected async void Application_Start(object sender, EventArgs args) - { - GlobalConfiguration.Configure(WebApiConfig.Register); - RouteConfig.RegisterRoutes(RouteTable.Routes); - - ObjectFactory.Initialize(); - ObjectFactory.Configure(Fr8.Infrastructure.StructureMap.StructureMapBootStrapper.LiveConfiguration); - ObjectFactory.Configure(Hub.StructureMap.StructureMapBootStrapper.LiveConfiguration); - ObjectFactory.Configure(PlanDirectoryBootStrapper.LiveConfiguration); - - DataAutoMapperBootStrapper.ConfigureAutoMapper(); - - Fr8.Infrastructure.Utilities.Server.ServerPhysicalPath = Server.MapPath("~"); - var segmentWriteKey = Fr8.Infrastructure.Utilities.Configuration.CloudConfigurationManager.GetSetting("SegmentWriteKey"); - if (!string.IsNullOrEmpty(segmentWriteKey)) - Analytics.Initialize(segmentWriteKey); - await ObjectFactory.GetInstance().Initialize(false); - await GenerateManifestPages(); - } - - private async Task GenerateManifestPages() - { - var systemUser = ObjectFactory.GetInstance().GetSystemUser()?.EmailAddress?.Address; - var generator = ObjectFactory.GetInstance(); - using (var uow = ObjectFactory.GetInstance().Create()) - { - var generateTasks = new List(); - foreach (var manifestName in uow.MultiTenantObjectRepository.Query(systemUser, x => true).Select(x => x.Name).Distinct()) - { - generateTasks.Add(generator.Generate(manifestName, GenerateMode.GenerateAlways)); - } - await Task.WhenAll(generateTasks); - } - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/AuthTokenManager.cs b/Services/PlanDirectory/Infrastructure/AuthTokenManager.cs deleted file mode 100644 index b063a89c33..0000000000 --- a/Services/PlanDirectory/Infrastructure/AuthTokenManager.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Runtime.Caching; -using System.Web.Caching; -using PlanDirectory.Interfaces; - -namespace PlanDirectory.Infrastructure -{ - public class AuthTokenManager : IAuthTokenManager - { - private const string TokenToFr8AccountPrefix = "TokenToFr8Account_"; - - - public string CreateToken(Guid fr8AccountId) - { - var token = Guid.NewGuid().ToString(); - MemoryCache.Default.Add( - TokenToFr8AccountPrefix + token, - fr8AccountId.ToString(), - DateTimeOffset.Now.AddMinutes(10) - ); - - return token; - } - - public Guid? GetFr8AccountId(string token) - { - var fr8AccountId = (string)MemoryCache.Default - .Get(TokenToFr8AccountPrefix + token); - - if (string.IsNullOrEmpty(fr8AccountId)) - { - return null; - } - - return Guid.Parse(fr8AccountId); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/HubAuthenticationPDHeaderSignature.cs b/Services/PlanDirectory/Infrastructure/HubAuthenticationPDHeaderSignature.cs deleted file mode 100644 index a4eacaaf5b..0000000000 --- a/Services/PlanDirectory/Infrastructure/HubAuthenticationPDHeaderSignature.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Net.Http; -using Fr8.Infrastructure.Interfaces; - -namespace PlanDirectory.Infrastructure -{ - public class HubAuthenticationPDHeaderSignature : IRequestSignature - { - private readonly string _fr8Token; - public HubAuthenticationPDHeaderSignature(string token, string userId) - { - _fr8Token = $"key={token}" + (string.IsNullOrEmpty(userId) ? "" : $", user={userId}"); - } - - public void SignRequest(HttpRequestMessage request) - { - request.Headers.Add(System.Net.HttpRequestHeader.Authorization.ToString(), $"FR8-PD {_fr8Token}"); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/PlanDirectoryAuthorizeAttribute.cs b/Services/PlanDirectory/Infrastructure/PlanDirectoryAuthorizeAttribute.cs deleted file mode 100644 index f8c4768b53..0000000000 --- a/Services/PlanDirectory/Infrastructure/PlanDirectoryAuthorizeAttribute.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Web; -using System.Web.Mvc; -using Hub.Managers; - -namespace PlanDirectory.Infrastructure -{ - public class PlanDirectoryAuthorizeAttribute : DockyardAuthorizeAttribute - { - public PlanDirectoryAuthorizeAttribute(params string[] roles) : base(roles) - { - } - - protected override string BuildRedirectUrl(AuthorizationContext context) - { - return VirtualPathUtility.ToAbsolute("~/Reauthenticate"); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs b/Services/PlanDirectory/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs deleted file mode 100644 index 22c0905366..0000000000 --- a/Services/PlanDirectory/Infrastructure/PlanDirectoryHMACAuthenticateAttribute.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Configuration; -using System.Security.Principal; -using System.Threading; -using System.Threading.Tasks; -using System.Web; -using System.Web.Http.Filters; -using Fr8.Infrastructure.Security; -using Fr8.Infrastructure.Utilities.Configuration; -using Hub.Infrastructure; - -namespace PlanDirectory.Infrastructure -{ - public class PlanDirectoryHMACAuthenticateAttribute : fr8HMACAuthenticateAttribute - { - private const string TerminalId = "PlanDirectory"; - - - public PlanDirectoryHMACAuthenticateAttribute() - { - } - - protected override void Success(HttpAuthenticationContext context, string terminalId, string userId) - { - var identity = new Fr8Identity("terminal-" + terminalId, userId); - var principle = new GenericPrincipal(identity, new string[] { }); - - Thread.CurrentPrincipal = principle; - context.Principal = principle; - - if (HttpContext.Current != null) - { - HttpContext.Current.User = principle; - } - } - - protected override Task GetTerminalSecret(string terminalId) - { - if (terminalId == TerminalId) - { - return Task.FromResult(CloudConfigurationManager.GetSetting("PlanDirectorySecret")); - } - - return Task.FromResult(null); - } - - protected override Task CheckPermission(string terminalId, string userId) - { - return Task.FromResult(true); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs b/Services/PlanDirectory/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs deleted file mode 100644 index a1109eae1c..0000000000 --- a/Services/PlanDirectory/Infrastructure/PlanDirectoryHubCommunicatorFactory.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Fr8.Infrastructure.Interfaces; -using Fr8.TerminalBase.Interfaces; -using Fr8.TerminalBase.Services; -using PlanDirectory.Interfaces; - -namespace PlanDirectory.Infrastructure -{ - public class PlanDirectoryHubCommunicatorFactory : IHubCommunicatorFactory - { - private readonly string _apiUrl; - private readonly string _terminalToken; - private readonly IRestfulServiceClientFactory _factory; - public PlanDirectoryHubCommunicatorFactory(IRestfulServiceClientFactory factory, string apiUrl, string terminalToken) - { - _apiUrl = apiUrl; - _terminalToken = terminalToken; - _factory = factory; - } - - public IHubCommunicator Create(string userId) - { - var restfulServiceClient = _factory.Create(new HubAuthenticationPDHeaderSignature(_terminalToken, userId)); - return new DefaultHubCommunicator(restfulServiceClient, _apiUrl, _terminalToken, userId); - } - } -} diff --git a/Services/PlanDirectory/Interfaces/IAuthTokenManager.cs b/Services/PlanDirectory/Interfaces/IAuthTokenManager.cs deleted file mode 100644 index 2bee225a6c..0000000000 --- a/Services/PlanDirectory/Interfaces/IAuthTokenManager.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace PlanDirectory.Interfaces -{ - public interface IAuthTokenManager - { - string CreateToken(Guid fr8AccountId); - Guid? GetFr8AccountId(string token); - } -} diff --git a/Services/PlanDirectory/Interfaces/IHubCommunicatorFactory.cs b/Services/PlanDirectory/Interfaces/IHubCommunicatorFactory.cs deleted file mode 100644 index a640cac44a..0000000000 --- a/Services/PlanDirectory/Interfaces/IHubCommunicatorFactory.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Fr8.TerminalBase.Interfaces; - -namespace PlanDirectory.Interfaces -{ - public interface IHubCommunicatorFactory - { - IHubCommunicator Create(string userId); - } -} diff --git a/Services/PlanDirectory/Interfaces/ITagGenerator.cs b/Services/PlanDirectory/Interfaces/ITagGenerator.cs deleted file mode 100644 index 147fb407a4..0000000000 --- a/Services/PlanDirectory/Interfaces/ITagGenerator.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Web; -using System.Threading.Tasks; -using PlanDirectory.Infrastructure; -using Fr8.Infrastructure.Data.Manifests; - -namespace PlanDirectory.Interfaces -{ - public interface ITagGenerator - { - Task GetTags(PlanTemplateCM planTemplateCM, string fr8AccountId); - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/PlanDirectory.csproj b/Services/PlanDirectory/PlanDirectory.csproj deleted file mode 100644 index 935eaad575..0000000000 --- a/Services/PlanDirectory/PlanDirectory.csproj +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - Debug - AnyCPU - - - 2.0 - {2B78433B-BA79-470B-BEF6-DBA5C1904865} - {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} - Library - Properties - PlanDirectory - PlanDirectory - v4.5 - true - - - - - - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - true - - - pdbonly - true - bin\ - TRACE - prompt - 4 - False - - - - ..\..\packages\Analytics.2.0.0\lib\Analytics.NET.dll - True - - - ..\..\packages\AutoMapper.4.0.4\lib\net45\AutoMapper.dll - True - - - ..\..\packages\EntityFramework.6.1.0\lib\net45\EntityFramework.dll - True - - - ..\..\packages\EntityFramework.6.1.0\lib\net45\EntityFramework.SqlServer.dll - True - - - ..\..\packages\log4net.2.0.5\lib\net45-full\log4net.dll - True - - - ..\..\packages\Microsoft.ApplicationInsights.2.0.0\lib\net45\Microsoft.ApplicationInsights.dll - True - - - ..\..\packages\Microsoft.AspNet.Identity.Core.2.0.1\lib\net45\Microsoft.AspNet.Identity.Core.dll - True - - - False - ..\..\packages\Microsoft.AspNet.Identity.EntityFramework.2.0.1\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll - - - ..\..\packages\Microsoft.Azure.Search.1.1.1\lib\net45\Microsoft.Azure.Search.dll - True - - - ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll - True - - - - ..\..\packages\Microsoft.Owin.3.0.1\lib\net45\Microsoft.Owin.dll - True - - - ..\..\packages\Microsoft.Owin.Host.HttpListener.2.0.2\lib\net45\Microsoft.Owin.Host.HttpListener.dll - True - - - ..\..\packages\Microsoft.Owin.Host.SystemWeb.3.0.1\lib\net45\Microsoft.Owin.Host.SystemWeb.dll - True - - - ..\..\packages\Microsoft.Owin.Hosting.3.0.1\lib\net45\Microsoft.Owin.Hosting.dll - True - - - ..\..\packages\Microsoft.Owin.Security.3.0.1\lib\net45\Microsoft.Owin.Security.dll - True - - - ..\..\packages\Microsoft.Owin.Security.Cookies.3.0.1\lib\net45\Microsoft.Owin.Security.Cookies.dll - True - - - ..\..\packages\Microsoft.Rest.ClientRuntime.1.8.1\lib\net45\Microsoft.Rest.ClientRuntime.dll - True - - - ..\..\packages\Microsoft.Rest.ClientRuntime.Azure.2.5.2\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll - True - - - ..\..\packages\Microsoft.Spatial.6.13.0\lib\portable-net40+sl5+wp8+win8+wpa\Microsoft.Spatial.dll - True - - - ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll - True - - - ..\..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll - True - - - ..\..\packages\Owin.1.0\lib\net40\Owin.dll - True - - - ..\..\packages\libphonenumber-csharp.7.2.5\lib\PhoneNumbers.dll - True - - - ..\..\packages\PusherServer.2.1.1.0\lib\net35\PusherServer.dll - True - - - ..\..\packages\RestSharp.105.2.3\lib\net45\RestSharp.dll - True - - - ..\..\packages\structuremap.3.1.6.186\lib\net40\StructureMap.dll - True - - - ..\..\packages\structuremap.3.1.6.186\lib\net40\StructureMap.Net4.dll - True - - - - - ..\..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll - True - - - ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll - True - - - ..\..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll - True - - - - - - - - - - - - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.Helpers.dll - True - - - ..\..\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll - True - - - ..\..\packages\Microsoft.AspNet.WebApi.Owin.5.2.3\lib\net45\System.Web.Http.Owin.dll - True - - - ..\..\packages\Microsoft.AspNet.WebApi.WebHost.5.2.3\lib\net45\System.Web.Http.WebHost.dll - True - - - ..\..\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll - True - - - ..\..\packages\Microsoft.AspNet.Razor.3.2.3\lib\net45\System.Web.Razor.dll - True - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.dll - True - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Deployment.dll - True - - - ..\..\packages\Microsoft.AspNet.WebPages.3.2.3\lib\net45\System.Web.WebPages.Razor.dll - True - - - - - - - - - - ..\..\packages\YamlDotNet.3.1.1\lib\net35\YamlDotNet.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextTemplatingFilePreprocessor - PlanCategoryTemplate.cs - - - - - TextTemplatingFilePreprocessor - ManifestDescriptionTemplate.cs - - - - - - - - - - - - - - - - - log4net.config - Always - - - log4net.Demo.config - Always - - - log4net.Dev.config - Always - - - log4net.Release.config - Always - - - Web.config - - - Web.config - - - Web.config - - - Web.config - Designer - - - - - - - - - - True - True - PlanCategoryTemplate.tt - - - - - - - - - - - Global.asax - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ManifestDescriptionTemplate.tt - True - True - - - - - - - - - - - - - - - - {990241ea-6cf0-4026-b57c-a9031463c7c0} - Data - - - {bba91af2-7636-41b6-87c4-c1575ae8b04b} - Fr8Infrastructure.NET - - - {bf96675e-6baf-4ac9-b247-1551d62e8c44} - Fr8TerminalBase.NET - - - {9891496c-8512-4708-925a-ee9d0f9199d4} - Hub - - - - - - - 10.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - true - bin\ - DEBUG;TRACE - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - False - - - true - bin\ - TRACE;DEBUG;DEV - full - AnyCPU - prompt - MinimumRecommendedRules.ruleset - False - - - - - - - - - True - - - - - - - - - - CustomCollectFilesDirectory; - $(CopyAllFilesToSingleFolderForPackageDependsOn); - - - CustomCollectFilesDirectory; - $(CopyAllFilesToSingleFolderForPackageDependsOn); - - - - - <_CustomFiles Include=".\bower_components\**\*" /> - - bower_components\%(RecursiveDir)%(Filename)%(Extension) - - - - - - $(CopyAllFilesToSingleFolderForPackageDependsOn); - CollectGulpOutput; - - - $(CopyAllFilesToSingleFolderForMsdeployDependsOn); - CollectGulpOutput; - - - - - $(CleanDependsOn); - CleanBowerComponents; - - - $(CleanDependsOn); - RemoveCompiledJsFiles; - - - - - - Scripts\app\%(Filename)%(Extension) - - - - - - - - - - <_CompiledJsFiles Include="Scripts\app\**\*.js" /> - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/PlanDirectoryHttpControllerTypeResolver.cs b/Services/PlanDirectory/PlanDirectoryHttpControllerTypeResolver.cs deleted file mode 100644 index ae6322076c..0000000000 --- a/Services/PlanDirectory/PlanDirectoryHttpControllerTypeResolver.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Web.Http.Dispatcher; - -namespace PlanDirectory -{ - public class PlanDirectoryHttpControllerTypeResolver : IHttpControllerTypeResolver - { - public ICollection GetControllerTypes(IAssembliesResolver assembliesResolver) - { - return new Type[] { - typeof(Controllers.Api.AuthenticationController), - typeof(Controllers.Api.PlanTemplatesController), - typeof(Controllers.Api.PageGenerationController) - }; - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/PreBuild.bat b/Services/PlanDirectory/PreBuild.bat deleted file mode 100644 index b54636e66a..0000000000 --- a/Services/PlanDirectory/PreBuild.bat +++ /dev/null @@ -1,2 +0,0 @@ -call npm install -call node_modules\.bin\gulp \ No newline at end of file diff --git a/Services/PlanDirectory/Properties/AssemblyInfo.cs b/Services/PlanDirectory/Properties/AssemblyInfo.cs deleted file mode 100644 index b00e3496e5..0000000000 --- a/Services/PlanDirectory/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("PlanDirectory")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("PlanDirectory")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("2b78433b-ba79-470b-bef6-dba5c1904865")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Services/PlanDirectory/SelfHostFactory.cs b/Services/PlanDirectory/SelfHostFactory.cs deleted file mode 100644 index ff30ce15c5..0000000000 --- a/Services/PlanDirectory/SelfHostFactory.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Web.Http; -using Owin; -using Microsoft.Owin.Hosting; -using Microsoft.Owin.Security.DataProtection; -using StructureMap; -using Hub.Infrastructure; -using PlanDirectory.Infrastructure; -using System.Web.Http.Dispatcher; -using PlanDirectory.Interfaces; - -namespace PlanDirectory -{ - public class SelfHostFactory - { - public class SelfHostStartup - { - public void Configuration(IAppBuilder app) - { - var configuration = new HttpConfiguration(); - // Web API routes - configuration.Services.Replace(typeof(IHttpControllerTypeResolver), new PlanDirectoryHttpControllerTypeResolver()); - - WebApiConfig.Register(configuration); - app.SetDataProtectionProvider(new DpapiDataProtectionProvider()); - - - ObjectFactory.Initialize(); - ObjectFactory.Configure(Fr8.Infrastructure.StructureMap.StructureMapBootStrapper.LiveConfiguration); - ObjectFactory.Configure(Hub.StructureMap.StructureMapBootStrapper.LiveConfiguration); - ObjectFactory.Configure(PlanDirectoryBootStrapper.LiveConfiguration); - - ObjectFactory.GetInstance().Initialize(true).Wait(); - - OwinInitializer.ConfigureAuth(app, "/Reauthenticate"); - app.UseWebApi(configuration); - } - } - - public static IDisposable CreateServer(string url) - { - return WebApp.Start(url: url); - } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Startup.cs b/Services/PlanDirectory/Startup.cs deleted file mode 100644 index 999c3fc9d4..0000000000 --- a/Services/PlanDirectory/Startup.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Web; -using Microsoft.Owin; -using Owin; -using Hub.Infrastructure; - -[assembly: OwinStartup(typeof(PlanDirectory.Startup))] -namespace PlanDirectory -{ - public class Startup - { - - public void Configuration(IAppBuilder app) - { - var reauthenticateUrl = VirtualPathUtility.ToAbsolute("~/Reauthenticate"); - OwinInitializer.ConfigureAuth(app, reauthenticateUrl); - } - } -} diff --git a/Services/PlanDirectory/ViewModels/HomeVM.cs b/Services/PlanDirectory/ViewModels/HomeVM.cs deleted file mode 100644 index f265aec5d4..0000000000 --- a/Services/PlanDirectory/ViewModels/HomeVM.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace PlanDirectory.ViewModels -{ - public class HomeVM - { - public string UserID { get; set; } - public string UserName { get; set; } - public string UserEmail { get; set; } - public string SegmentWriteKey { get; set; } - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/ViewModels/NavLinks.cs b/Services/PlanDirectory/ViewModels/NavLinks.cs deleted file mode 100644 index fd0c41c435..0000000000 --- a/Services/PlanDirectory/ViewModels/NavLinks.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Configuration; - -namespace PlanDirectory.ViewModels -{ - public static class NavLinks - { - private static string _baseUrl; - public static string BaseUrl - { - get - { - _baseUrl = ConfigurationManager.AppSettings["ServerProtocol"] + - ConfigurationManager.AppSettings["ServerDomainName"]; - var port = ConfigurationManager.AppSettings["ServerPort"]; - if (port != null && !port.Contains("80") && !port.Contains("443")) - { - _baseUrl = _baseUrl + ':' + port; - } - return _baseUrl; - } - } - public static string Blog = "http://blog.fr8.co"; - public static string Developers = "https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md"; - public static string PlanDirectory = ConfigurationManager.AppSettings["PlanDirectoryUrl"]; - } -} \ No newline at end of file diff --git a/Services/PlanDirectory/Views/Home/Reauthenticate.cshtml b/Services/PlanDirectory/Views/Home/Reauthenticate.cshtml deleted file mode 100644 index 0c2380ee39..0000000000 --- a/Services/PlanDirectory/Views/Home/Reauthenticate.cshtml +++ /dev/null @@ -1,14 +0,0 @@ -@{ - Layout = null; -} - - - - - - - - -

Reauthenticate

- - diff --git a/Services/PlanDirectory/Views/Shared/HomeNav.cshtml b/Services/PlanDirectory/Views/Shared/HomeNav.cshtml deleted file mode 100644 index 0f5d8a5ed0..0000000000 --- a/Services/PlanDirectory/Views/Shared/HomeNav.cshtml +++ /dev/null @@ -1,86 +0,0 @@ -@using PlanDirectory.ViewModels - diff --git a/Services/PlanDirectory/Web.Debug.config b/Services/PlanDirectory/Web.Debug.config deleted file mode 100644 index 667450731e..0000000000 --- a/Services/PlanDirectory/Web.Debug.config +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/Web.Demo.config b/Services/PlanDirectory/Web.Demo.config deleted file mode 100644 index c452c3ae0b..0000000000 --- a/Services/PlanDirectory/Web.Demo.config +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/Web.Dev.config b/Services/PlanDirectory/Web.Dev.config deleted file mode 100644 index cba7e5ef8a..0000000000 --- a/Services/PlanDirectory/Web.Dev.config +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/Web.Release.config b/Services/PlanDirectory/Web.Release.config deleted file mode 100644 index 34a801292c..0000000000 --- a/Services/PlanDirectory/Web.Release.config +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/Web.config b/Services/PlanDirectory/Web.config deleted file mode 100644 index 5ae54da2fc..0000000000 --- a/Services/PlanDirectory/Web.config +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -
-
- - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Services/PlanDirectory/bower.json b/Services/PlanDirectory/bower.json deleted file mode 100644 index ec1a2f84d4..0000000000 --- a/Services/PlanDirectory/bower.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Fr8PlanDirectory", - "version": "1.0.0", - "private": true, - "dependencies": { - "angular": "1.4.9", - "jquery": "~2.1.4", - "bootstrap": "~3.3.1", - "angular-ui-bootstrap-bower": "~1.3.2" - }, - "devDependencies": {} -} diff --git a/Services/PlanDirectory/gulpfile.js b/Services/PlanDirectory/gulpfile.js deleted file mode 100644 index 5495132a19..0000000000 --- a/Services/PlanDirectory/gulpfile.js +++ /dev/null @@ -1,8 +0,0 @@ -var gulp = require('gulp'); -var bower = require('gulp-bower'); - -gulp.task('bower', function (done) { - return bower({ layout: "byComponent" }); -}); - -gulp.task('default', ['bower']); diff --git a/Services/PlanDirectory/package.json b/Services/PlanDirectory/package.json deleted file mode 100644 index 3c4cc352f0..0000000000 --- a/Services/PlanDirectory/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": "1.0.0", - "name": "Fr8PlanDirectory", - "dependencies": { - "bower": "^1.3.12", - "gulp": "^3.8.10", - "gulp-bower": "^0.0.7" - }, - "devDependencies": { - } -} diff --git a/Services/PlanDirectory/packages.config b/Services/PlanDirectory/packages.config deleted file mode 100644 index 7f96662846..0000000000 --- a/Services/PlanDirectory/packages.config +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Startup.cs b/Startup.cs index a63f12df8f..0ddbc5b430 100644 --- a/Startup.cs +++ b/Startup.cs @@ -30,6 +30,7 @@ using GlobalConfiguration = Hangfire.GlobalConfiguration; using System.Globalization; using System.Threading; +using PlanDirectory.Infrastructure; [assembly: OwinStartup(typeof(HubWeb.Startup))] @@ -59,6 +60,11 @@ public async void Configuration(IAppBuilder app, bool selfHostMode) { ObjectFactory.Configure(Fr8.Infrastructure.StructureMap.StructureMapBootStrapper.LiveConfiguration); StructureMapBootStrapper.ConfigureDependencies(StructureMapBootStrapper.DependencyType.LIVE); + + //For PlanDirectory merge + ObjectFactory.Configure(PlanDirectoryBootStrapper.LiveConfiguration); + + ObjectFactory.GetInstance().ConfigureAutoMapper(); var db = ObjectFactory.GetInstance(); @@ -71,7 +77,7 @@ public async void Configuration(IAppBuilder app, bool selfHostMode) incidentReporter.SubscribeToAlerts(); StartupMigration.CreateSystemUser(); - StartupMigration.MoveSalesforceRefreshTokensIntoKeyVault(); + StartupMigration.UpdateTransitionNames(); SetServerUrl(); @@ -82,7 +88,7 @@ public async void Configuration(IAppBuilder app, bool selfHostMode) System.Web.Http.GlobalConfiguration.Configure(ConfigureControllerActivator); } - ConfigureHangfire(app, "DockyardDB"); + ConfigureHangfire(app, "Fr8LocalDB"); #pragma warning disable 4014 RegisterTerminalActions(selfHostMode); @@ -113,7 +119,7 @@ private async Task RegisterTerminalActions(bool selfHostMode) { var terminalDiscovery = ObjectFactory.GetInstance(); - await terminalDiscovery.Discover(); + await terminalDiscovery.DiscoverAll(); if (!selfHostMode) { diff --git a/TerminalSqlUtilities/LICENSE b/TerminalSqlUtilities/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/TerminalSqlUtilities/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/TerminalSqlUtilities/TerminalSqlUtilities.csproj b/TerminalSqlUtilities/TerminalSqlUtilities.csproj index 7fdb855e25..a87ba5cb9c 100644 --- a/TerminalSqlUtilities/TerminalSqlUtilities.csproj +++ b/TerminalSqlUtilities/TerminalSqlUtilities.csproj @@ -126,6 +126,7 @@ + diff --git a/TerminalSqlUtilities/app.config b/TerminalSqlUtilities/app.config index 9fed52de35..4e2385d297 100644 --- a/TerminalSqlUtilities/app.config +++ b/TerminalSqlUtilities/app.config @@ -30,6 +30,14 @@ + + + + + + + + diff --git a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalDropbox.cs b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalDropbox.cs index 932acfc514..37ca4f9f94 100644 --- a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalDropbox.cs +++ b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalDropbox.cs @@ -29,7 +29,7 @@ public async Task AddAndConfigure_GetFileList(PlanDTO plan, int ord var dropboxGetFileListActivityDto = FixtureData.Get_File_List_v1_InitialConfiguration(); var activityName = "Get_File_List"; - var activityCategoryParam = (int)ActivityCategory.Receivers; + var activityCategoryParam = ActivityCategories.ReceiveId.ToString(); var activityTemplates = await _baseHubITest .HttpGetAsync>( _baseHubITest.GetHubApiBaseUrl() + "webservices?id=" + activityCategoryParam); diff --git a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalFr8.cs b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalFr8.cs index 5bf54d676d..c8281ca84d 100644 --- a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalFr8.cs +++ b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalFr8.cs @@ -35,7 +35,7 @@ public async Task AddAndConfigureBuildMessage(PlanDTO plan, int ord var activityName = "Build_Message"; var buildMessageActivityDTO = FixtureData.Build_Message_v1_InitialConfiguration(); - var activityCategoryParam = (int)ActivityCategory.Processors; + var activityCategoryParam = ActivityCategories.ProcessId.ToString(); var activityTemplates = await _baseHubITest.HttpGetAsync>(_baseHubITest.GetHubApiBaseUrl() + "webservices?id=" + activityCategoryParam); var apmActivityTemplate = activityTemplates .SelectMany(a => a.Activities) @@ -113,7 +113,7 @@ public async Task AddAndConfigureSaveToFr8Warehouse(PlanDTO plan, i { var activityName = "Save_To_Fr8_Warehouse"; var saveToFr8WarehouseActivity = FixtureData.Save_To_Fr8_Warehouse_InitialConfiguration(); - var activityCategoryParam = (int)ActivityCategory.Processors; + var activityCategoryParam = ActivityCategories.ProcessId.ToString(); var activityTemplates = await _baseHubITest.HttpGetAsync>(_baseHubITest.GetHubApiBaseUrl() + "webservices?id=" + activityCategoryParam); var apmActivityTemplate = activityTemplates .SelectMany(a => a.Activities) diff --git a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalGoogle.cs b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalGoogle.cs index 76530822a0..53053fe2a0 100644 --- a/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalGoogle.cs +++ b/Tests/Fr8.Testing.Integration.Tools/Activities/IntegrationTestTools_terminalGoogle.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Fr8.Infrastructure.Data.Control; @@ -41,7 +42,7 @@ public async Task AddAndConfigureSaveToGoogleSheet(PlanDTO plan, { var activityName = "Save_To_Google_Sheet"; - var saveToGoogleSheetActivityDTO = await AddGoogleActivityToPlan(FixtureData.Save_To_Google_Sheet_v1_InitialConfiguration(), plan, ordering, ActivityCategory.Forwarders, activityName); + var saveToGoogleSheetActivityDTO = await AddGoogleActivityToPlan(FixtureData.Save_To_Google_Sheet_v1_InitialConfiguration(), plan, ordering, ActivityCategories.ForwardId, activityName); //Activity won't be able to run if there is no upstream data var upstreamCrateDescriptions = await _baseHubITest.GetRuntimeCrateDescriptionsFromUpstreamActivities(saveToGoogleSheetActivityDTO.Id); @@ -73,7 +74,7 @@ public async Task AddAndConfigureSaveToGoogleSheet(PlanDTO plan, public async Task CreateMonitorGmailInbox(PlanDTO plan, int ordering) { - return await AddGoogleActivityToPlan(FixtureData.Monitor_Gmail_Inbox_v1_InitialConfiguration(), plan, ordering, ActivityCategory.Monitors, "Monitor_Gmail_Inbox", false); + return await AddGoogleActivityToPlan(FixtureData.Monitor_Gmail_Inbox_v1_InitialConfiguration(), plan, ordering, ActivityCategories.MonitorId, "Monitor_Gmail_Inbox", false); } public async Task SaveActivity(ActivityDTO activity) @@ -99,7 +100,7 @@ public async Task AddAndConfigureGetFromGoogleSheet(PlanDTO plan, i { var activityName = "Get_Google_Sheet_Data"; - var getFromGoogleSheetActivityDTO = await AddGoogleActivityToPlan(FixtureData.Get_Google_Sheet_Data_v1_InitialConfiguration(), plan, ordering, ActivityCategory.Receivers, activityName); + var getFromGoogleSheetActivityDTO = await AddGoogleActivityToPlan(FixtureData.Get_Google_Sheet_Data_v1_InitialConfiguration(), plan, ordering, ActivityCategories.ReceiveId, activityName); return await ConfigureGetFromGoogleSheetActivity(getFromGoogleSheetActivityDTO, spreadsheetName, includeFixtureAuthToken); } @@ -171,10 +172,10 @@ public async Task ConfigureGetFromGoogleSheetActivity(ActivityDTO g /// /// /// - private async Task AddGoogleActivityToPlan(ActivityDTO activity, PlanDTO plan, int ordering, ActivityCategory activityCategory, string activityName, bool checkAuthentication = true) + private async Task AddGoogleActivityToPlan(ActivityDTO activity, PlanDTO plan, int ordering, Guid activityCategory, string activityName, bool checkAuthentication = true) { var googleActivityDTO = activity; - var activityCategoryParam = (int)activityCategory; + var activityCategoryParam = activityCategory.ToString(); var activityTemplates = await _baseHubITest .HttpGetAsync>(_baseHubITest.GetHubApiBaseUrl() + "webservices?id=" + activityCategoryParam); var apmActivityTemplate = activityTemplates diff --git a/Tests/Fr8.Testing.Integration.Tools/Fr8.Testing.Integration.Tools.csproj b/Tests/Fr8.Testing.Integration.Tools/Fr8.Testing.Integration.Tools.csproj index 3793ff41d8..465541f431 100644 --- a/Tests/Fr8.Testing.Integration.Tools/Fr8.Testing.Integration.Tools.csproj +++ b/Tests/Fr8.Testing.Integration.Tools/Fr8.Testing.Integration.Tools.csproj @@ -165,6 +165,7 @@ + diff --git a/Tests/Fr8.Testing.Integration.Tools/LICENSE b/Tests/Fr8.Testing.Integration.Tools/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/Fr8.Testing.Integration.Tools/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/Fr8.Testing/Fr8.Testing.csproj b/Tests/Fr8.Testing/Fr8.Testing.csproj index e5138ed72c..8444912892 100644 --- a/Tests/Fr8.Testing/Fr8.Testing.csproj +++ b/Tests/Fr8.Testing/Fr8.Testing.csproj @@ -174,6 +174,7 @@ + Designer diff --git a/Tests/Fr8.Testing/Integration/BasePlanDirectoryIntegrationTest.cs b/Tests/Fr8.Testing/Integration/BasePlanDirectoryIntegrationTest.cs index a2ec07d79a..e35486db5f 100644 --- a/Tests/Fr8.Testing/Integration/BasePlanDirectoryIntegrationTest.cs +++ b/Tests/Fr8.Testing/Integration/BasePlanDirectoryIntegrationTest.cs @@ -41,7 +41,7 @@ public BasePlanDirectoryIntegrationTest() private string GetPlanDirectoryBaseApiUrl() { - return ConfigurationManager.AppSettings["PlanDirectoryBaseApiUrl"]; + return ConfigurationManager.AppSettings["PlanDirectoryBaseApiUrl"]; } private Uri GetPlanDirectoryBaseUri() diff --git a/Tests/Fr8.Testing/LICENSE b/Tests/Fr8.Testing/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/Fr8.Testing/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/Fr8.Testing/Unit/BaseTest.cs b/Tests/Fr8.Testing/Unit/BaseTest.cs index 19d10bb0d2..c1c0701c01 100644 --- a/Tests/Fr8.Testing/Unit/BaseTest.cs +++ b/Tests/Fr8.Testing/Unit/BaseTest.cs @@ -12,6 +12,7 @@ using Data.Infrastructure.StructureMap; using Data.Interfaces; using Data.Entities; +using Data.States; using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.States; using Fr8.Infrastructure.Data.Managers; @@ -159,7 +160,7 @@ public static void ConfigureAutoMapper() .ForMember(a => a.Description, opts => opts.ResolveUsing(ad => ad.Description)) .ForMember(a => a.LastUpdated, opts => opts.ResolveUsing(ad => ad.LastUpdated)) .ForMember(a => a.Name, opts => opts.ResolveUsing(ad => ad.Name)) - .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => ad.PlanState)) + .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => PlanState.IntToString(ad.PlanState))) .ForMember(a => a.StartingSubPlanId, opts => opts.ResolveUsing(ad => ad.StartingSubPlanId)) .ForMember(a => a.Tag, opts => opts.ResolveUsing(ad => ad.Tag)) .ForMember(a => a.Visibility, opts => opts.ResolveUsing(ad => new PlanVisibilityDTO() { Hidden = ad.Visibility.BooleanValue() })); @@ -169,7 +170,7 @@ public static void ConfigureAutoMapper() .ForMember(a => a.Description, opts => opts.ResolveUsing(ad => ad.Description)) .ForMember(a => a.LastUpdated, opts => opts.ResolveUsing(ad => ad.LastUpdated)) .ForMember(a => a.Name, opts => opts.ResolveUsing(ad => ad.Name)) - .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => ad.PlanState)) + .ForMember(a => a.PlanState, opts => opts.ResolveUsing(ad => PlanState.StringToInt(ad.PlanState))) .ForMember(a => a.StartingSubPlanId, opts => opts.ResolveUsing(ad => ad.StartingSubPlanId)) .ForMember(a => a.Tag, opts => opts.ResolveUsing(ad => ad.Tag)) .ForMember(a => a.Visibility, opts => opts.ResolveUsing(ad => ad.Visibility?.PlanVisibilityValue())); diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - ActionTemplate.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - ActionTemplate.cs index 7057846e66..cfa45b06de 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - ActionTemplate.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - ActionTemplate.cs @@ -107,7 +107,6 @@ public static ActivityTemplateDO TestActivityTemplateDO3() Name = "Mail_Merge_Into_DocuSign", Label = "Mail Merge Into DocuSign", Terminal = TerminalSeven(), - Category = ActivityCategory.Solution, Version = "1" }; return curActivityDO; @@ -119,7 +118,6 @@ public static ActivityTemplateDO TestActivityTemplateDO4() Name = "Extract_Data_From_Envelopes", Label = "Extract Data From Envelopes", Terminal = TerminalSeven(), - Category = ActivityCategory.Solution, Version = "1" }; return curActivityDO; diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Activity2.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Activity2.cs index 9f33503548..734c5dcfd5 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Activity2.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Activity2.cs @@ -47,7 +47,10 @@ public static ActivityTemplateDO ActivityTemplate() Version = "1", Endpoint = "", TerminalStatus = TerminalStatus.Active, - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + Id = FixtureData.GetTestGuidById(1), + ParticipationState = ParticipationState.Approved }, Version = "1" @@ -87,6 +90,7 @@ public static ActivityTemplateDO ActivityTemplateSMS() Label = "Send a Text (SMS) Message", Version = "1", Endpoint = "", + OperationalState = OperationalState.Active, TerminalStatus = TerminalStatus.Active, Secret = Guid.NewGuid().ToString() }, @@ -414,7 +418,7 @@ public static ActivityDO TestActivityUnstarted() Id = GetTestGuidById(1), Name = "A", Description = "B", - PlanState = PlanState.Running + PlanState = PlanState.Executing }; var containerDO = new ContainerDO() @@ -453,7 +457,7 @@ public static ActivityDO TestActivityAuthenticate1() { TerminalDO curTerminalDO = new TerminalDO() { - Id = 1, + Id = FixtureData.GetTestGuidById(1), Name = "AzureSqlServer", Label = "AzureSqlServer", TerminalStatus = 1, @@ -469,7 +473,7 @@ public static ActivityDO TestActivityAuthenticate1() //ParentPluginRegistration = "pluginAzureSqlServer", Version = "v1", Terminal = curTerminalDO, - TerminalId = 1, + TerminalId = FixtureData.GetTestGuidById(1), }; @@ -479,7 +483,7 @@ public static ActivityDO TestActivityAuthenticate1() Id = GetTestGuidById(1), Description = "descr 1", Name = "template1", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, Fr8Account = FixtureData.TestDockyardAccount1() }; diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - AuthorizationToken.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - AuthorizationToken.cs index 50170a4d74..8c4f2f4868 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - AuthorizationToken.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - AuthorizationToken.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using StructureMap; using Data.Entities; using Data.Interfaces; @@ -16,12 +17,15 @@ public static void AddTestActivityTemplate() { uow.TerminalRepository.Add(new TerminalDO { - Id = 1, + Id = FixtureData.GetTestGuidById(1), Name = "testTerminal", Label = "test", Version = "v1", Secret = "test", - TerminalStatus = 1 + TerminalStatus = 1, + ParticipationState = ParticipationState.Approved, + OperationalState = OperationalState.Active, + Endpoint="http://localhost:11111" }); uow.SaveChanges(); uow.ActivityTemplateRepository.Add(GetTestActivityTemplateDO()); @@ -31,9 +35,10 @@ public static void AddTestActivityTemplate() public static ActivityTemplateDO GetTestActivityTemplateDO() { - return new ActivityTemplateDO("Test", "test", "v1", "test", 1) + return new ActivityTemplateDO("Test", "test", "v1", "test", FixtureData.GetTestGuidById(1)) { - Id = FixtureData.GetTestGuidById(1) + Id = FixtureData.GetTestGuidById(1), + Categories = new List() }; } @@ -44,7 +49,7 @@ public static void AddAuthorizationToken(Fr8AccountDO user, string externalAccou var tokenDO = new AuthorizationTokenDO() { UserID = user.Id, - TerminalID = 1, + TerminalID = FixtureData.GetTestGuidById(1), AuthorizationTokenState = AuthorizationTokenState.Active, ExpiresAt = null, Token = @"{""Email"":""64684b41-bdfd-4121-8f81-c825a6a03582"",""ApiPassword"":""HyCXOBeGl/Ted9zcMqd7YEKoN0Q=""}", diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Plan.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Plan.cs index 02a59a01b3..b61448a79c 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Plan.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Plan.cs @@ -8,6 +8,7 @@ using Fr8.Infrastructure.Data.Managers; using Hub.Managers; using Fr8.Infrastructure.Utilities.Serializers.Json; +using Fr8.Infrastructure.Data.States; namespace Fr8.Testing.Unit.Fixtures { @@ -20,7 +21,7 @@ public static PlanDO TestPlan1() Id = GetTestGuidById(33), Description = "descr 1", Name = "template1", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; @@ -34,7 +35,7 @@ public static PlanDO TestPlan2() Id = GetTestGuidById(50), Description = "descr 2", Name = "template2", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, //UserId = "testUser1" //Fr8Account = FixtureData.TestDockyardAccount1() @@ -49,7 +50,7 @@ public static PlanDO TestPlanHealthDemo() Id = GetTestGuidById(23), Description = "DO-866 HealthDemo Integration Test", Name = "HealthDemoIntegrationTest", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; return healthPlan; } @@ -61,7 +62,7 @@ public static PlanDO TestPlanWithSubPlans() Id = GetTestGuidById(1), Description = "DO-982 Process Node Template Test", Name = "PlanWithSubPlans", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; for (int i = 1; i <= 4; ++i) @@ -91,7 +92,7 @@ public static PlanDO TestPlanWithSubscribeEvent() Id = GetTestGuidById(23), Description = "HealthDemo Integration Test", Name = "StandardEventTesting", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, Fr8Account = testUser }; uow.PlanRepository.Add(planDO); @@ -167,7 +168,7 @@ public static PlanDO TestPlanWithSubscribeEvent(Fr8AccountDO user, int idOffset Id = GetTestGuidById(23 + idOffset), Description = "HealthDemo Integration Test", Name = "StandardEventTesting", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, Fr8Account = user }; uow.PlanRepository.Add(planDO); @@ -236,7 +237,7 @@ public static PlanDO TestPlan3() Id = GetTestGuidById(1), Description = "DO-1040 Process Template Test", Name = "Poress template", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; for (int i = 2; i <= 3; ++i) @@ -261,7 +262,7 @@ public static PlanDO TestPlanNoMatchingParentActivity() Id = GetTestGuidById(1), Description = "DO-1040 Process Template Test", Name = "Poress template", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; for (int i = 2; i <= 3; ++i) @@ -286,7 +287,7 @@ public static PlanDO TestPlanWithStartingSubPlan() Id = GetTestGuidById(1), Description = "DO-1124 Proper deletion of Plan", Name = "TestPlanWithStartingSubPlans", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; var curSubPlanDO = new SubplanDO() @@ -311,7 +312,7 @@ public static PlanDO TestPlanWithStartingSubPlanAndActivityList() Id = GetTestGuidById(1), Description = "DO-1124 Proper deletion of Plan", Name = "TestPlanWithStartingSubPlan", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; var curSubPlanDO = new SubplanDO() @@ -340,7 +341,7 @@ public static PlanDO TestPlanWithStartingSubPlans_ID0() { Description = "DO-1124 Proper deletion of Plan", Name = "TestPlanWithStartingSubPlans_ID0", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; var curSubPlanDO = new SubplanDO() @@ -361,7 +362,7 @@ public static PlanDO TestPlan_CanCreate() { Description = "DO-1217 Unit Tests for Process#Create", Name = "DO-1217", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; return curPlanDO; } @@ -373,7 +374,7 @@ public static PlanDO TestPlan4() Id = GetTestGuidById(30), Description = "Description 4", Name = "Plan 4", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, Fr8Account = FixtureData.TestDockyardAccount5() }; return plan; @@ -386,7 +387,7 @@ public static PlanDO TestPlan5() Id = GetTestGuidById(40), Description = "Description 5", Name = "Plan 5", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, Fr8Account = FixtureData.TestDockyardAccount5() }; return plan; @@ -398,7 +399,7 @@ public static PlanDO TestContainerCreateAddsLogs() Id = GetTestGuidById(1), Description = "DO-1419 Container Create Adds Logs Test", Name = "Container Create", - PlanState = PlanState.Running + PlanState = PlanState.Executing }; return curPlanDO; diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - PlanDTO.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - PlanDTO.cs index 61ad36dd0c..210979feb8 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - PlanDTO.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - PlanDTO.cs @@ -11,7 +11,7 @@ public static PlanNoChildrenDTO CreateTestPlanDTO(string planName = "") { Name = string.IsNullOrEmpty(planName) ? "plan1" : planName, Description = "Description for test plan", - PlanState = 1, + PlanState = "Inactive", Visibility = new PlanVisibilityDTO() { Hidden = false } //DockyardAccount = FixtureData.TestDockyardAccount1() }; diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Terminal.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Terminal.cs index d41123b44b..a2b363ee2c 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Terminal.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - Terminal.cs @@ -1,6 +1,7 @@ using System; using Data.Entities; using Fr8.Infrastructure.Data.States; +using Data.States; namespace Fr8.Testing.Unit.Fixtures { @@ -15,7 +16,9 @@ public static TerminalDO TerminalOne() Endpoint = "terminalAzureSqlServer", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } @@ -28,7 +31,9 @@ public static TerminalDO TerminalTwo() Endpoint = "AzureSqlServer", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } @@ -41,7 +46,9 @@ public static TerminalDO TerminalThree() Endpoint = "http://localhost:46281/", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } @@ -54,7 +61,9 @@ public static TerminalDO TerminalFour() Endpoint = "AzureSqlServer", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } @@ -67,7 +76,9 @@ public static TerminalDO TerminalFive() Endpoint = "localhost", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } @@ -75,27 +86,31 @@ public static TerminalDO TerminalSix() { return new TerminalDO { - Id = 1, + Id = FixtureData.GetTestGuidById(1), Name = "DocuSign", Label = "DocuSign", Endpoint = "http://localhost", TerminalStatus = TerminalStatus.Active, Version = "1", AuthenticationType = AuthenticationType.External, - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } public static TerminalDO TerminalSeven() { return new TerminalDO { - Id = 1, + Id = FixtureData.GetTestGuidById(1), Name = "terminalDocuSign", Label = "DocuSign", Endpoint = "localhost", TerminalStatus = TerminalStatus.Active, Version = "1", - Secret = Guid.NewGuid().ToString() + Secret = Guid.NewGuid().ToString(), + OperationalState = OperationalState.Active, + ParticipationState = ParticipationState.Approved }; } } diff --git a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - TerminalIntegration.cs b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - TerminalIntegration.cs index 3ce79a2178..5155d7d409 100644 --- a/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - TerminalIntegration.cs +++ b/Tests/Fr8.Testing/Unit/Fixtures/FixtureData - TerminalIntegration.cs @@ -32,7 +32,7 @@ public static PlanDO Plan_TerminalIntegration() Id = GetTestGuidById(1000), Name = "Test Plan Name", Description = "Test Plan Description", - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; } @@ -150,7 +150,6 @@ public static ActivityTemplateDO TestActivityTemplateDO_RecordDocuSignEvents() Name = "Record_DocuSign_Events", Label = "Record DocuSign Events", Version = "1", - Category = ActivityCategory.Forwarders, Terminal = TestTerminal_DocuSign(), NeedsAuthentication = true, MinPaneWidth = 330 @@ -164,7 +163,6 @@ public static ActivityTemplateDO TestActivityTemplateDO_StoreMTData() Id = Guid.NewGuid(), Name = "Save_To_Fr8_Warehouse", Label = "Save To Fr8 Warehouse", - Category = ActivityCategory.Processors, Terminal = TestTerminal_Core(), Version = "1" }; @@ -226,7 +224,6 @@ public static ActivityTemplateDO TestActivityTemplateDO_MonitorFr8Events() Name = "Monitor_Fr8_Events", Label = "Monitor Fr8 Events", Version = "1", - Category = ActivityCategory.Monitors, NeedsAuthentication = false, Terminal = TestTerminal_Core(), MinPaneWidth = 380 diff --git a/Tests/Fr8.Testing/Unit/MiscUtils.cs b/Tests/Fr8.Testing/Unit/MiscUtils.cs index 59e717827a..456366fd02 100644 --- a/Tests/Fr8.Testing/Unit/MiscUtils.cs +++ b/Tests/Fr8.Testing/Unit/MiscUtils.cs @@ -9,8 +9,8 @@ public class MiscUtilsTest [Test] public void MaskPassword_Should_MaskPasswordWithSemicolon() { - string cs = "Data Source=.;Initial Catalog=DockyardDB2;Integrated Security=SSPI;Password=strong!password;"; - string cs_expected = "Data Source=.;Initial Catalog=DockyardDB2;Integrated Security=SSPI;Password=*****;"; + string cs = "Data Source=.;Initial Catalog=Fr8LocalDB;Integrated Security=SSPI;Password=strong!password;"; + string cs_expected = "Data Source=.;Initial Catalog=Fr8LocalDB;Integrated Security=SSPI;Password=*****;"; string masked = MiscUtils.MaskPassword(cs); Assert.AreEqual(cs_expected, masked); } @@ -18,8 +18,8 @@ public void MaskPassword_Should_MaskPasswordWithSemicolon() [Test] public void MaskPassword_Should_MaskPasswordWithoutSemicolon() { - string cs = "Data Source=.;Initial Catalog=DockyardDB2;Integrated Security=SSPI;Password=strong!password"; - string cs_expected = "Data Source=.;Initial Catalog=DockyardDB2;Integrated Security=SSPI;Password=*****"; + string cs = "Data Source=.;Initial Catalog=Fr8LocalDB;Integrated Security=SSPI;Password=strong!password"; + string cs_expected = "Data Source=.;Initial Catalog=Fr8LocalDB;Integrated Security=SSPI;Password=*****"; string masked = MiscUtils.MaskPassword(cs); Assert.AreEqual(cs_expected, masked); } diff --git a/Tests/HealthMonitor.HubLauncher/App.config b/Tests/HealthMonitor.HubLauncher/App.config index 3a4874b337..38ef2838c1 100644 --- a/Tests/HealthMonitor.HubLauncher/App.config +++ b/Tests/HealthMonitor.HubLauncher/App.config @@ -7,23 +7,28 @@
- + - - + + + + + - + + + diff --git a/Tests/HealthMonitor.HubLauncher/HealthMonitor.HubLauncher.csproj b/Tests/HealthMonitor.HubLauncher/HealthMonitor.HubLauncher.csproj index f4aa56a9d6..d39260dea1 100644 --- a/Tests/HealthMonitor.HubLauncher/HealthMonitor.HubLauncher.csproj +++ b/Tests/HealthMonitor.HubLauncher/HealthMonitor.HubLauncher.csproj @@ -186,7 +186,9 @@ - + + Designer + Designer PreserveNewest @@ -203,6 +205,10 @@ ApplicationInsights.config PreserveNewest + + + Always + @@ -223,12 +229,12 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + + + + + + + %level - %message%newline + 36m + 33m + 31m + + + + + + + \ No newline at end of file diff --git a/Tests/HealthMonitor.HubLauncher/packages.config b/Tests/HealthMonitor.HubLauncher/packages.config index 7c17c09669..c4600f7ee3 100644 --- a/Tests/HealthMonitor.HubLauncher/packages.config +++ b/Tests/HealthMonitor.HubLauncher/packages.config @@ -3,7 +3,7 @@ - + diff --git a/Tests/HealthMonitor/App.Demo.config b/Tests/HealthMonitor/App.Demo.config index 4a1ffe9c0b..417545e6bc 100644 --- a/Tests/HealthMonitor/App.Demo.config +++ b/Tests/HealthMonitor/App.Demo.config @@ -5,12 +5,15 @@ + + - + + - + diff --git a/Tests/HealthMonitor/App.Dev.config b/Tests/HealthMonitor/App.Dev.config index 18bdc645f2..a9951a9e73 100644 --- a/Tests/HealthMonitor/App.Dev.config +++ b/Tests/HealthMonitor/App.Dev.config @@ -4,15 +4,22 @@ + - + + + + + + + - + diff --git a/Tests/HealthMonitor/App.Release.config b/Tests/HealthMonitor/App.Release.config index 9449a1de90..b06053c6fd 100644 --- a/Tests/HealthMonitor/App.Release.config +++ b/Tests/HealthMonitor/App.Release.config @@ -5,13 +5,17 @@ + - + + + + - + diff --git a/Tests/HealthMonitor/App.config b/Tests/HealthMonitor/App.config index 83e864ac78..33a71b46a4 100644 --- a/Tests/HealthMonitor/App.config +++ b/Tests/HealthMonitor/App.config @@ -9,7 +9,7 @@ - + @@ -21,9 +21,11 @@ - + + - + + @@ -31,25 +33,6 @@ - - @@ -58,9 +41,7 @@ - - - + @@ -83,6 +64,7 @@ + diff --git a/Tests/HealthMonitor/Build-Settings.ps1 b/Tests/HealthMonitor/Build-Settings.ps1 index 2526fcb6b4..9d13bc1335 100644 --- a/Tests/HealthMonitor/Build-Settings.ps1 +++ b/Tests/HealthMonitor/Build-Settings.ps1 @@ -4,7 +4,7 @@ This scripts collects Hub and terminal settings from respective exterminal confi (Config/Settings.config) and adds settings from them to the HM external configuration file. This script is added as a post-build task to HealthMonitor project in the following way: -powershell.exe –NonInteractive –ExecutionPolicy Unrestricted –command "& { $(ProjectDir)BuildSettings.ps1 }" +powershell.exe –NonInteractive –ExecutionPolicy Unrestricted –command "& { $(ProjectDir)Build-Settings.ps1 }" #> $ErrorActionPreference = 'Stop' @@ -12,7 +12,7 @@ $includeNodesToDelete = New-Object System.Collections.ArrayList $healthMonitorPath = Split-Path -parent $PSCommandPath $configPath = "$healthMonitorPath\Config\HealthMonitor\Settings.config.src" $solutionRootPath = Split-Path -parent (Split-Path -parent $configPath) -$ignoredSettings = @('HubApiVersion', 'TerminalSecret', 'TerminalId', 'owin:AutomaticAppStartup', 'DefaultHubUrl') +$ignoredSettings = @('HubApiVersion', 'TerminalSecret', 'TerminalId', 'owin:AutomaticAppStartup', 'DefaultHubUrl', 'HubApiBaseUrl') [string[]] $only if(-not (Test-Path $configPath)) { diff --git a/Tests/HealthMonitor/HealthMonitor.csproj b/Tests/HealthMonitor/HealthMonitor.csproj index 3e587be7e2..bf618e5a08 100644 --- a/Tests/HealthMonitor/HealthMonitor.csproj +++ b/Tests/HealthMonitor/HealthMonitor.csproj @@ -345,6 +345,7 @@ PreserveNewest + Designer @@ -361,10 +362,6 @@ {bba91af2-7636-41b6-87c4-c1575ae8b04b} Fr8Infrastructure.NET - - {2b78433b-ba79-470b-bef6-dba5c1904865} - PlanDirectory - {c982a6fe-6fd4-47fa-a69d-91ffa80fedaa} terminalFacebook @@ -551,7 +548,7 @@ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + @@ -565,7 +562,7 @@ - + - + diff --git a/Tests/PlanDirectoryTests/App.config b/Tests/PlanDirectoryTests/App.config index f575383390..273f699e32 100644 --- a/Tests/PlanDirectoryTests/App.config +++ b/Tests/PlanDirectoryTests/App.config @@ -30,6 +30,14 @@ + + + + + + + + diff --git a/Tests/PlanDirectoryTests/Infrastructure/ManifestPageGeneratorTests.cs b/Tests/PlanDirectoryTests/Infrastructure/ManifestPageGeneratorTests.cs index 642e39a86c..0a42fafc78 100644 --- a/Tests/PlanDirectoryTests/Infrastructure/ManifestPageGeneratorTests.cs +++ b/Tests/PlanDirectoryTests/Infrastructure/ManifestPageGeneratorTests.cs @@ -8,9 +8,11 @@ using Hub.Interfaces; using Moq; using NUnit.Framework; -using PlanDirectory.Exceptions; +using Hub.Exceptions; +using Hub.Enums; +using Hub.Services.PlanDirectory; using PlanDirectory.Infrastructure; -using PlanDirectory.Interfaces; + namespace PlanDirectoryTests.Infrastructure { diff --git a/Tests/PlanDirectoryTests/LICENSE b/Tests/PlanDirectoryTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/PlanDirectoryTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/PlanDirectoryTests/PlanDirectoryTests.csproj b/Tests/PlanDirectoryTests/PlanDirectoryTests.csproj index 19a06fdfdf..69922634f9 100644 --- a/Tests/PlanDirectoryTests/PlanDirectoryTests.csproj +++ b/Tests/PlanDirectoryTests/PlanDirectoryTests.csproj @@ -76,6 +76,7 @@ + @@ -91,10 +92,6 @@ {9891496C-8512-4708-925A-EE9D0F9199D4} Hub - - {2B78433B-BA79-470B-BEF6-DBA5C1904865} - PlanDirectory - diff --git a/Tests/terminalAsanaTests/LICENSE b/Tests/terminalAsanaTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalAsanaTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalAsanaTests/terminalAsanaTests.csproj b/Tests/terminalAsanaTests/terminalAsanaTests.csproj index 2032c13157..7e176c5eb9 100644 --- a/Tests/terminalAsanaTests/terminalAsanaTests.csproj +++ b/Tests/terminalAsanaTests/terminalAsanaTests.csproj @@ -84,6 +84,7 @@ + diff --git a/Tests/terminalAtlassianTests/LICENSE b/Tests/terminalAtlassianTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalAtlassianTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalAtlassianTests/terminalAtlassianTests.csproj b/Tests/terminalAtlassianTests/terminalAtlassianTests.csproj index 39f78bb028..441a990f01 100644 --- a/Tests/terminalAtlassianTests/terminalAtlassianTests.csproj +++ b/Tests/terminalAtlassianTests/terminalAtlassianTests.csproj @@ -218,6 +218,7 @@ + diff --git a/Tests/terminalAzureTests/LICENSE b/Tests/terminalAzureTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalAzureTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalAzureTests/terminalAzureTests.csproj b/Tests/terminalAzureTests/terminalAzureTests.csproj index d4e4dacff2..8dd54d1d12 100644 --- a/Tests/terminalAzureTests/terminalAzureTests.csproj +++ b/Tests/terminalAzureTests/terminalAzureTests.csproj @@ -163,6 +163,7 @@ + diff --git a/Tests/terminalBaseTests/LICENSE b/Tests/terminalBaseTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalBaseTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalBaseTests/Services/HubDiscoveryServiceTests.cs b/Tests/terminalBaseTests/Services/HubDiscoveryServiceTests.cs index b762afbfaa..5b3e4ce55c 100644 --- a/Tests/terminalBaseTests/Services/HubDiscoveryServiceTests.cs +++ b/Tests/terminalBaseTests/Services/HubDiscoveryServiceTests.cs @@ -164,7 +164,6 @@ public void Setup() { var activityStore = new ActivityStoreStub(new TerminalDTO { - PublicIdentifier = "test", Endpoint = "http://test", Name = "test" }); diff --git a/Tests/terminalBaseTests/terminalBaseTests.csproj b/Tests/terminalBaseTests/terminalBaseTests.csproj index 9f56d24b00..6524a266fd 100644 --- a/Tests/terminalBaseTests/terminalBaseTests.csproj +++ b/Tests/terminalBaseTests/terminalBaseTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -250,6 +250,7 @@ Designer + Designer @@ -267,7 +268,13 @@ - $(SolutionDir)\BuildUtils\xcopy.exe $(SolutionDir)\terminalGoogle\bin\terminalGoogle.dll.config $(TargetDir) /C /Y + $(SolutionDir)\terminalGoogle\bin\terminalGoogle.dll.config + + + + + + diff --git a/Tests/terminalBasecamp2Tests/LICENSE b/Tests/terminalBasecamp2Tests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalBasecamp2Tests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalBasecamp2Tests/terminalBasecamp2Tests.csproj b/Tests/terminalBasecamp2Tests/terminalBasecamp2Tests.csproj index 5ea80713d4..479b82c724 100644 --- a/Tests/terminalBasecamp2Tests/terminalBasecamp2Tests.csproj +++ b/Tests/terminalBasecamp2Tests/terminalBasecamp2Tests.csproj @@ -89,6 +89,7 @@ + diff --git a/Tests/terminalBoxTests/LICENSE b/Tests/terminalBoxTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalBoxTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalBoxTests/app.config b/Tests/terminalBoxTests/app.config index aa0c6b91af..7ba2d21ef2 100644 --- a/Tests/terminalBoxTests/app.config +++ b/Tests/terminalBoxTests/app.config @@ -7,7 +7,7 @@ - + diff --git a/Tests/terminalBoxTests/terminalBoxTests.csproj b/Tests/terminalBoxTests/terminalBoxTests.csproj index e7549abc67..64d7ccaa75 100644 --- a/Tests/terminalBoxTests/terminalBoxTests.csproj +++ b/Tests/terminalBoxTests/terminalBoxTests.csproj @@ -160,6 +160,7 @@ Designer + diff --git a/Tests/terminalDocuSignTests/Fixtures/DocuSignActivitiesFixtureData.cs b/Tests/terminalDocuSignTests/Fixtures/DocuSignActivitiesFixtureData.cs index 0ed41d9d97..6fbb53e9bf 100644 --- a/Tests/terminalDocuSignTests/Fixtures/DocuSignActivitiesFixtureData.cs +++ b/Tests/terminalDocuSignTests/Fixtures/DocuSignActivitiesFixtureData.cs @@ -18,7 +18,6 @@ public class BaseDocusignActivityMock : BaseDocuSignActivity Label = "BaseDocusignActivityMock", NeedsAuthentication = true, MinPaneWidth = 330, - WebService = TerminalData.WebServiceDTO, Terminal = TerminalData.TerminalDTO }; protected override ActivityTemplateDTO MyTemplate => ActivityTemplateDTO; diff --git a/Tests/terminalDocuSignTests/Fixtures/HealthMonitor_FixtureData.cs b/Tests/terminalDocuSignTests/Fixtures/HealthMonitor_FixtureData.cs index e3523c1e62..1e0a66c348 100644 --- a/Tests/terminalDocuSignTests/Fixtures/HealthMonitor_FixtureData.cs +++ b/Tests/terminalDocuSignTests/Fixtures/HealthMonitor_FixtureData.cs @@ -233,7 +233,6 @@ public static ActivityTemplateDTO Monitor_DocuSign_v1_ActivityTemplate_For_Solut Name = "Monitor_DocuSign_Envelope_Activity", Version = "1", Label = "Monitor DocuSign Envelope Activity", - Category = ActivityCategory.Forwarders, Categories = new[] { ActivityCategories.Forward } }; } @@ -246,7 +245,6 @@ public static ActivityTemplateDTO Send_DocuSign_Envelope_v1_ActivityTemplate_for Name = "Send_DocuSign_Envelope", Label = "Send DocuSign Envelope", Version = "1", - Category = ActivityCategory.Forwarders, Categories = new [] { ActivityCategories.Forward } }; } diff --git a/Tests/terminalDocuSignTests/Integration/Extract_Data_From_Envelopes_v1_EndToEnd_Tests.cs b/Tests/terminalDocuSignTests/Integration/Extract_Data_From_Envelopes_v1_EndToEnd_Tests.cs index a55634c684..f69a37a5c1 100644 --- a/Tests/terminalDocuSignTests/Integration/Extract_Data_From_Envelopes_v1_EndToEnd_Tests.cs +++ b/Tests/terminalDocuSignTests/Integration/Extract_Data_From_Envelopes_v1_EndToEnd_Tests.cs @@ -72,14 +72,14 @@ public async Task Extract_Data_From_Envelopes_EndToEnd() _solution = await HttpPostAsync(baseUrl + "activities/configure?id=" + _solution.Id, _solution); _crateStorage = Crate.FromDto(_solution.CrateStorage); Assert.AreEqual(2, _solution.ChildrenActivities.Count(), "Solution child activities failed to create."); - Assert.True(_solution.ChildrenActivities.Any(a => a.Name == "Monitor DocuSign Envelope Activity" && a.Ordering == 1), + Assert.True(_solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Monitor_DocuSign_Envelope_Activity" && a.Ordering == 1), "Failed to detect Monitor DocuSign Envelope Activity as the first child activity"); - Assert.True(_solution.ChildrenActivities.Any(a => a.Name == "Send DocuSign Envelope" && a.Ordering == 2), + Assert.True(_solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Send_DocuSign_Envelope" && a.Ordering == 2), "Failed to detect Send DocuSign Envelope as the second child activity"); var monitorDocuSignEnvelopeActivity = _solution.ChildrenActivities - .Single(x => x.Name == "Monitor DocuSign Envelope Activity"); + .Single(x => x.ActivityTemplate.Name == "Monitor_DocuSign_Envelope_Activity"); // // Apply auth-token to child MonitorDocuSignEvnelope activity. @@ -159,7 +159,7 @@ await HttpPostAsync(_baseUrl + "plans?id=" + plan.Id, // // Configure Send DocuSign Envelope action // - var sendEnvelopeAction = _solution.ChildrenActivities.Single(a => a.Name == "Send DocuSign Envelope"); + var sendEnvelopeAction = _solution.ChildrenActivities.Single(a => a.ActivityTemplate.Name == "Send_DocuSign_Envelope"); var sendEnvelopeApplyToken = new AuthenticationTokenGrantDTO() { @@ -232,8 +232,8 @@ await HttpPostAsync( await HttpDeleteAsync(_baseUrl + "activities?id=" + _solution.ChildrenActivities[0].Id); // Add Add Payload Manually action - var activityCategoryParam =(int)ActivityCategory.Processors; - var activityTemplates = await HttpGetAsync>(_baseUrl + "webservices?id="+ activityCategoryParam); + var activityCategoryParam = ActivityCategories.ProcessId.ToString(); + var activityTemplates = await HttpGetAsync>(_baseUrl + "webservices?id=" + activityCategoryParam); var apmActivityTemplate = activityTemplates .SelectMany(a => a.Activities) .Single(a => a.Name == "Add_Payload_Manually"); @@ -247,7 +247,6 @@ await HttpPostAsync( var apmAction = new ActivityDTO() { ActivityTemplate = activityTemplateSummary, - Name = apmActivityTemplate.Label, ParentPlanNodeId = _solution.Id, RootPlanNodeId = plan.Id }; diff --git a/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_EndToEnd_Tests.cs b/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_EndToEnd_Tests.cs index a500620a30..907956848c 100644 --- a/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_EndToEnd_Tests.cs +++ b/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_EndToEnd_Tests.cs @@ -84,13 +84,13 @@ public async Task Mail_Merge_Into_DocuSign_EndToEnd_Upstream_Values_From_Google_ // // configure Get_Google_Sheet_Data activity // - var googleSheetActivity = this.solution.ChildrenActivities.Single(a => a.Name.Equals("get google sheet data", StringComparison.InvariantCultureIgnoreCase)); + var googleSheetActivity = this.solution.ChildrenActivities.Single(a => a.ActivityTemplate.Name.Equals("Get_Google_Sheet_Data", StringComparison.InvariantCultureIgnoreCase)); await googleActivityTestTools.ConfigureGetFromGoogleSheetActivity(googleSheetActivity, spreadsheetName, false, worksheetName); // // configure Loop activity // - var loopActivity = this.solution.ChildrenActivities.Single(a => a.Name.Equals("loop", StringComparison.InvariantCultureIgnoreCase)); + var loopActivity = this.solution.ChildrenActivities.Single(a => a.ActivityTemplate.Name.Equals("Loop", StringComparison.InvariantCultureIgnoreCase)); var terminalFr8CoreTools = new IntegrationTestTools_terminalFr8(this); loopActivity = await terminalFr8CoreTools.ConfigureLoopActivity(loopActivity, "Standard Table Data", "Table Generated From Google Sheet Data"); @@ -101,7 +101,7 @@ public async Task Mail_Merge_Into_DocuSign_EndToEnd_Upstream_Values_From_Google_ // // Initial Configuration // - var sendEnvelopeAction = loopActivity.ChildrenActivities.Single(a => a.Name == "Send DocuSign Envelope"); + var sendEnvelopeAction = loopActivity.ChildrenActivities.Single(a => a.ActivityTemplate.Name == "Send_DocuSign_Envelope"); crateStorage = Crate.FromDto(sendEnvelopeAction.CrateStorage); var controlsCrate = crateStorage.CratesOfType().First(); diff --git a/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_Tests.cs b/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_Tests.cs index 750934cd86..7da08bf892 100644 --- a/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_Tests.cs +++ b/Tests/terminalDocuSignTests/Integration/Mail_Merge_Into_DocuSign_v1_Tests.cs @@ -65,7 +65,6 @@ private void AddHubActivityTemplate(Fr8DataDTO dataDTO) Name = "Get Google Sheet Data", Label = "Get Google Sheet Data", Tags = "Table Data Generator", - Category = ActivityCategory.Receivers, Categories = new[] { ActivityCategories.Receive } } ); diff --git a/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_EndToEnd_Tests.cs b/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_EndToEnd_Tests.cs index a5b4f9eb17..926dbd5c84 100644 --- a/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_EndToEnd_Tests.cs +++ b/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_EndToEnd_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using NUnit.Framework; using Fr8.Testing.Integration; @@ -195,6 +196,7 @@ public async Task Track_DocuSign_Recipients_EndToEnd() timePeriod.Minutes = 0; var handlersCrate = _crateStorage.CratesOfType().Single(c => c.Label == "AvailableHandlers"); var emailHandler = handlersCrate.Content.Values.Single(c => c.Key.Contains("Send Email")); + // var emailHandler = handlersCrate.Content.Values.First(c => c.Key.Contains("Send Email Using SendGrid")); notificationHandler.Value = emailHandler.Value; notificationHandler.selectedKey = emailHandler.Key; var recipientEventsCrate = _crateStorage.CratesOfType().Single(c => c.Label == "AvailableRecipientEvents"); @@ -213,16 +215,20 @@ public async Task Track_DocuSign_Recipients_EndToEnd() //from now on our solution should have followup crate structure Assert.True(this._solution.ChildrenActivities.Length == 4, "Solution child actions failed to create."); - Assert.True(this._solution.ChildrenActivities.Any(a => a.Name == "Monitor Docusign Envelope Activity" && a.Ordering == 1)); - Assert.True(this._solution.ChildrenActivities.Any(a => a.Name == "Set Delay" && a.Ordering == 2)); - Assert.True(this._solution.ChildrenActivities.Any(a => a.Name == "Query Fr8 Warehouse" && a.Ordering == 3)); - Assert.True(this._solution.ChildrenActivities.Any(a => a.Name == "Test Incoming Data" && a.Ordering == 4)); + Assert.True(this._solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Monitor_DocuSign_Envelope_Activity" && a.Ordering == 1)); + Assert.True(this._solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Set_Delay" && a.Ordering == 2)); + Assert.True(this._solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Query_Fr8_Warehouse" && a.Ordering == 3)); + Assert.True(this._solution.ChildrenActivities.Any(a => a.ActivityTemplate.Name == "Test_Incoming_Data" && a.Ordering == 4)); plan = await HttpGetAsync(planReloadUrl); Assert.AreEqual(3, plan.SubPlans.First().Activities.Count); - Assert.True(plan.SubPlans.First().Activities.Any(a => a.Name == "Build a Message" && a.Ordering == 2)); + Assert.True(plan.SubPlans.First().Activities.Any(a => a.ActivityTemplate.Name == "Build_Message" && a.Ordering == 2)); var emailActivity = plan.SubPlans.First().Activities.Last(); - Assert.True(emailActivity.Name == notificationHandler.selectedKey); + + var activityTemplates = await HttpGetAsync>($"{baseUrl}/activity_templates"); + var templates = activityTemplates.SelectMany(x => x.Activities); + var selectedActivityName = templates.Single(x => x.Id == Guid.Parse(notificationHandler.Value)); + Assert.True(emailActivity.ActivityTemplate.Name == selectedActivityName.Name); //let's configure email settings diff --git a/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_Tests.cs b/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_Tests.cs index 1ff61241a0..9fd0955f78 100644 --- a/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_Tests.cs +++ b/Tests/terminalDocuSignTests/Integration/Track_DocuSign_Recipients_v1_Tests.cs @@ -65,7 +65,6 @@ private void AddHubActivityTemplate(Fr8DataDTO dataDTO) Version = "1", Name = "Monitor_DocuSign_Envelope_Activity", Label = "Monitor DocuSign Envelope Activity", - Category = ActivityCategory.Monitors, Categories = new[] { ActivityCategories.Monitor }, Terminal = terminal, NeedsAuthentication = true, @@ -77,7 +76,6 @@ private void AddHubActivityTemplate(Fr8DataDTO dataDTO) Version = "1", Name = "Set_Delay", Label = "Delay Action Processing", - Category = ActivityCategory.Processors, Categories = new[] { ActivityCategories.Process }, Terminal = terminalCoreDO, NeedsAuthentication = false, @@ -89,7 +87,6 @@ private void AddHubActivityTemplate(Fr8DataDTO dataDTO) Version = "1", Name = "Test_Incoming_Data", Label = "Test Incoming Data", - Category = ActivityCategory.Processors, Categories = new[] { ActivityCategories.Process }, Terminal = terminalCoreDO, NeedsAuthentication = false @@ -110,7 +107,6 @@ private void AddHubActivityTemplate(Fr8DataDTO dataDTO) Version = "1", Name = "Query_Fr8_Warehouse", Label = "Query Fr8 Warehouse", - Category = ActivityCategory.Processors, Categories = new[] { ActivityCategories.Process }, Terminal = terminalCoreDO, NeedsAuthentication = false, diff --git a/Tests/terminalDocuSignTests/LICENSE b/Tests/terminalDocuSignTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalDocuSignTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalDocuSignTests/app.config b/Tests/terminalDocuSignTests/app.config index 475981250e..08b7f7b095 100644 --- a/Tests/terminalDocuSignTests/app.config +++ b/Tests/terminalDocuSignTests/app.config @@ -12,7 +12,7 @@ - + diff --git a/Tests/terminalDocuSignTests/terminalDocuSignTests.csproj b/Tests/terminalDocuSignTests/terminalDocuSignTests.csproj index 41bd202d05..7207f43ed2 100644 --- a/Tests/terminalDocuSignTests/terminalDocuSignTests.csproj +++ b/Tests/terminalDocuSignTests/terminalDocuSignTests.csproj @@ -195,6 +195,7 @@ + diff --git a/Tests/terminalDropboxTests/LICENSE b/Tests/terminalDropboxTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalDropboxTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalDropboxTests/app.config b/Tests/terminalDropboxTests/app.config index 789599649f..e640d9a8ab 100644 --- a/Tests/terminalDropboxTests/app.config +++ b/Tests/terminalDropboxTests/app.config @@ -8,7 +8,7 @@ - + diff --git a/Tests/terminalDropboxTests/terminalDropboxTests.csproj b/Tests/terminalDropboxTests/terminalDropboxTests.csproj index f8137100ac..ac5a9300e4 100644 --- a/Tests/terminalDropboxTests/terminalDropboxTests.csproj +++ b/Tests/terminalDropboxTests/terminalDropboxTests.csproj @@ -243,6 +243,7 @@ Designer + Designer diff --git a/Tests/terminalExcelTests/LICENSE b/Tests/terminalExcelTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalExcelTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalExcelTests/app.config b/Tests/terminalExcelTests/app.config index d4c00c4517..ee86d0fc73 100644 --- a/Tests/terminalExcelTests/app.config +++ b/Tests/terminalExcelTests/app.config @@ -22,7 +22,7 @@ - + diff --git a/Tests/terminalExcelTests/terminalExcelTests.csproj b/Tests/terminalExcelTests/terminalExcelTests.csproj index 0ab740ab0e..0e78b43655 100644 --- a/Tests/terminalExcelTests/terminalExcelTests.csproj +++ b/Tests/terminalExcelTests/terminalExcelTests.csproj @@ -173,6 +173,7 @@ + diff --git a/Tests/terminalFacebookTests/LICENSE b/Tests/terminalFacebookTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalFacebookTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalFacebookTests/app.config b/Tests/terminalFacebookTests/app.config index a5430accef..0757895c1b 100644 --- a/Tests/terminalFacebookTests/app.config +++ b/Tests/terminalFacebookTests/app.config @@ -8,7 +8,7 @@ - + @@ -41,6 +41,14 @@ + + + + + + + + diff --git a/Tests/terminalFacebookTests/terminalFacebookTests.csproj b/Tests/terminalFacebookTests/terminalFacebookTests.csproj index 06c90d49bd..a647bb7b4b 100644 --- a/Tests/terminalFacebookTests/terminalFacebookTests.csproj +++ b/Tests/terminalFacebookTests/terminalFacebookTests.csproj @@ -83,6 +83,7 @@ + diff --git a/Tests/terminalFr8CoreTests/Integration/SetDelay_v1_Tests.cs b/Tests/terminalFr8CoreTests/Integration/SetDelay_v1_Tests.cs index f8559091b1..fdfcb1fe5b 100644 --- a/Tests/terminalFr8CoreTests/Integration/SetDelay_v1_Tests.cs +++ b/Tests/terminalFr8CoreTests/Integration/SetDelay_v1_Tests.cs @@ -149,7 +149,6 @@ private ActivityDTO CreateRequestActivityFixture() var requestActionDTO = new ActivityDTO { Id = Guid.NewGuid(), - Name = "Set_Delay", Label = "Delay Action Processing", ActivityTemplate = activityTemplate, AuthToken = null diff --git a/Tests/terminalFr8CoreTests/Integration/Terminal_Discover_v1Tests.cs b/Tests/terminalFr8CoreTests/Integration/Terminal_Discover_v1Tests.cs index 05cfcb5ceb..36e6968f92 100644 --- a/Tests/terminalFr8CoreTests/Integration/Terminal_Discover_v1Tests.cs +++ b/Tests/terminalFr8CoreTests/Integration/Terminal_Discover_v1Tests.cs @@ -9,13 +9,13 @@ namespace terminalFr8CoreTests.Integration [Explicit] public class Terminal_Discover_v1Tests : BaseTerminalIntegrationTest { - private const int Fr8CoreActivityCount = 22; + private const int Fr8CoreActivityCount = 21; private const string TestIncomingDataName = "Test_Incoming_Data"; private const string AddPayloadManuallyName = "Add_Payload_Manually"; private const string SaveToFr8WarehouseName = "Save_To_Fr8_Warehouse"; private const string Select_Fr8_ObjectName = "Select_Fr8_Object"; private const string ConnectToSqlName = "Connect_To_Sql"; - private const string BuildQueryName = "Build_Query"; + //private const string BuildQueryName = "Build_Query"; private const string ExecuteSqlName = "Execute_Sql"; private const string LoopName = "Loop"; private const string SetDelayName = "Set_Delay"; @@ -54,7 +54,7 @@ public async Task Discover_Check_Returned_Activities() Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == SaveToFr8WarehouseName), "SaveToFr8WarehouseName wasn`t found"); Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == Select_Fr8_ObjectName), "Select_Fr8_ObjectName wasn`t found"); Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == ConnectToSqlName), "ConnectToSqlName wasn`t found"); - Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == BuildQueryName), "BuildQueryName wasn`t found"); + // Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == BuildQueryName), "BuildQueryName wasn`t found"); Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == ExecuteSqlName), "ExecuteSqlName wasn`t found"); Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == LoopName), "LoopName wasn`t found"); Assert.AreEqual(true, terminalDiscoverResponse.Activities.Any(a => a.Name == SetDelayName), "SetDelayName wasn`t found"); diff --git a/Tests/terminalFr8CoreTests/LICENSE b/Tests/terminalFr8CoreTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalFr8CoreTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalFr8CoreTests/app.config b/Tests/terminalFr8CoreTests/app.config index 0c973e1862..762419ea97 100644 --- a/Tests/terminalFr8CoreTests/app.config +++ b/Tests/terminalFr8CoreTests/app.config @@ -6,10 +6,6 @@ - - - - diff --git a/Tests/terminalFr8CoreTests/terminalFr8CoreTests.csproj b/Tests/terminalFr8CoreTests/terminalFr8CoreTests.csproj index 150f62710e..c6d046106d 100644 --- a/Tests/terminalFr8CoreTests/terminalFr8CoreTests.csproj +++ b/Tests/terminalFr8CoreTests/terminalFr8CoreTests.csproj @@ -263,6 +263,7 @@ Designer + Designer diff --git a/Tests/terminalGoogleTests/App.config b/Tests/terminalGoogleTests/App.config index 4837ea6b83..10a7906506 100644 --- a/Tests/terminalGoogleTests/App.config +++ b/Tests/terminalGoogleTests/App.config @@ -7,7 +7,7 @@ - + diff --git a/Tests/terminalGoogleTests/Integration/Terminal_Discover_v1_Tests.cs b/Tests/terminalGoogleTests/Integration/Terminal_Discover_v1_Tests.cs index 5f099f56cb..dc3e68f3e5 100644 --- a/Tests/terminalGoogleTests/Integration/Terminal_Discover_v1_Tests.cs +++ b/Tests/terminalGoogleTests/Integration/Terminal_Discover_v1_Tests.cs @@ -2,6 +2,7 @@ using Fr8.Testing.Integration; using NUnit.Framework; using System.Threading.Tasks; +using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Data.States; @@ -38,10 +39,10 @@ public async Task Terminal_Google_Discover() Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Any(a => a.Name == "Save_To_Google_Sheet"), true, "Action Save_To_Google_Sheet was not loaded"); Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Any(a => a.Name == "Monitor_Gmail_Inbox"), true, "Action Monitor_Gmail_Inbox was not loaded"); //Check Activities Categories - Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Get_Google_Sheet_Data").Category, ActivityCategory.Receivers, "Activity Get_Google_Sheet_Data is not of Category Receivers"); - Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Monitor_Form_Responses").Category, ActivityCategory.Monitors, "Activity Monitor_Form_Responses is not of Category Monitors"); - Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Save_To_Google_Sheet").Category, ActivityCategory.Forwarders, "Activity Save_To_Google_Sheet is not of Category Forwarders"); - Assert.AreEqual(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Monitor_Gmail_Inbox").Category, ActivityCategory.Monitors, "Activity Monitor_Gmail_Inbox is not of Category Monitors"); + Assert.True(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Get_Google_Sheet_Data").Categories.Any(x => x.Id == ActivityCategories.ReceiveId), "Activity Get_Google_Sheet_Data is not of Category Receivers"); + Assert.True(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Monitor_Form_Responses").Categories.Any(x => x.Id == ActivityCategories.MonitorId), "Activity Monitor_Form_Responses is not of Category Monitors"); + Assert.True(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Save_To_Google_Sheet").Categories.Any(x => x.Id == ActivityCategories.ForwardId), "Activity Save_To_Google_Sheet is not of Category Forwarders"); + Assert.True(googleTerminalDiscoveryResponse.Activities.Single(a => a.Name == "Monitor_Gmail_Inbox").Categories.Any(x => x.Id == ActivityCategories.MonitorId), "Activity Monitor_Gmail_Inbox is not of Category Monitors"); } } } diff --git a/Tests/terminalGoogleTests/LICENSE b/Tests/terminalGoogleTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalGoogleTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalGoogleTests/terminalGoogleTests.csproj b/Tests/terminalGoogleTests/terminalGoogleTests.csproj index 4995e0e099..af552fdddb 100644 --- a/Tests/terminalGoogleTests/terminalGoogleTests.csproj +++ b/Tests/terminalGoogleTests/terminalGoogleTests.csproj @@ -172,6 +172,7 @@ Designer + diff --git a/Tests/terminalInstagramTests/LICENSE b/Tests/terminalInstagramTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalInstagramTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalInstagramTests/app.config b/Tests/terminalInstagramTests/app.config index 7028d12e96..2e821dd9d5 100644 --- a/Tests/terminalInstagramTests/app.config +++ b/Tests/terminalInstagramTests/app.config @@ -8,7 +8,7 @@ - + diff --git a/Tests/terminalInstagramTests/terminalInstagramTests.csproj b/Tests/terminalInstagramTests/terminalInstagramTests.csproj index 4fc677436d..834a0f49bf 100644 --- a/Tests/terminalInstagramTests/terminalInstagramTests.csproj +++ b/Tests/terminalInstagramTests/terminalInstagramTests.csproj @@ -205,6 +205,7 @@ Designer + diff --git a/Tests/terminalIntegrationTests/EndToEnd/Query_DocuSign_Into_Google_Sheet_Tests.cs b/Tests/terminalIntegrationTests/EndToEnd/Query_DocuSign_Into_Google_Sheet_Tests.cs deleted file mode 100644 index eea30d43ea..0000000000 --- a/Tests/terminalIntegrationTests/EndToEnd/Query_DocuSign_Into_Google_Sheet_Tests.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Fr8.Infrastructure.Interfaces; - -using NUnit.Framework; -using StructureMap; -using Fr8.Testing.Integration; -using Fr8.Testing.Integration.Tools.Activities; -using Fr8.Testing.Integration.Tools.Plans; -using terminalGoogle.Services; -using terminalGoogle.Services.Authorization; - -namespace terminalIntegrationTests.EndToEnd -{ - [Explicit] - public class Query_DocuSign_Into_Google_Sheet_Tests : BaseHubIntegrationTest - { - #region Properties - - private readonly IntegrationTestTools plansHelper; - private readonly IntegrationTestTools_terminalDocuSign docuSignActivityConfigurator; - private readonly IntegrationTestTools_terminalGoogle googleActivityConfigurator; - public override string TerminalName => "terminalGoogle"; - - #endregion - - public Query_DocuSign_Into_Google_Sheet_Tests() - { - plansHelper = new IntegrationTestTools(this); - docuSignActivityConfigurator = new IntegrationTestTools_terminalDocuSign(this); - googleActivityConfigurator = new IntegrationTestTools_terminalGoogle(this); - } - - [Test, Ignore, Category("Integration.terminalGoogle")] - public async Task Query_DocuSign_Into_Google_Sheet_End_To_End() - { - - var terminalGoogleTools = new Fr8.Testing.Integration.Tools.Terminals.IntegrationTestTools_terminalGoogle(this); - var googleAuthTokenId = await terminalGoogleTools.ExtractGoogleDefaultToken(); - var defaultGoogleAuthToken = terminalGoogleTools.GetGoogleAuthToken(googleAuthTokenId); - - //create a new plan - var thePlan = await plansHelper.CreateNewPlan(); - - //configure an query_DocuSign activity - await docuSignActivityConfigurator.AddAndConfigure_QueryDocuSign(thePlan, 1, 2); - - //configure a save_to google activity - var newSpeadsheetName = Guid.NewGuid().ToString(); - var googleSheetApi = new GoogleSheet(new GoogleIntegration(ObjectFactory.GetInstance()), new GoogleDrive()); - var spreadsheetId = await googleSheetApi.CreateSpreadsheet(newSpeadsheetName, defaultGoogleAuthToken); - - await googleActivityConfigurator.AddAndConfigureSaveToGoogleSheet(thePlan, 2, "Docusign Envelope v3", "DocuSign Envelope Data", newSpeadsheetName); - - - try - { - //run the plan - await plansHelper.RunPlan(thePlan.Id); - - //add asserts here - var googleSheets = await googleSheetApi.GetSpreadsheets(defaultGoogleAuthToken); - - Assert.IsNotNull(googleSheets.FirstOrDefault(x => x.Value == newSpeadsheetName), "New created spreadsheet was not found into existing google files."); - var spreadSheeturl = googleSheets.FirstOrDefault(x => x.Value == newSpeadsheetName).Key; - - //find spreadsheet - var worksheets = await googleSheetApi.GetWorksheets(spreadSheeturl, defaultGoogleAuthToken); - Assert.IsNotNull(worksheets.FirstOrDefault(x => x.Value == "Sheet1"), "Worksheet was not found into newly created google excel file."); - var worksheetUri = worksheets.FirstOrDefault(x => x.Value == "Sheet1").Key; - var dataRows = await googleSheetApi.GetData(spreadSheeturl, worksheetUri, defaultGoogleAuthToken); - - //file should contain 11 envelopes saved - var numberOfEnvelopes = dataRows.ToList().Count(); - Assert.AreNotEqual(0, numberOfEnvelopes, "Failed to read any envelope data from excel rows. Run method may failed to write data into excel file"); - //Assert.AreEqual(6, numberOfEnvelopes, "Number of read rows/envelopes was not in the correct count"); - } - finally - { - //cleanup. erase the sheet - await googleSheetApi.DeleteSpreadSheet(spreadsheetId, defaultGoogleAuthToken); - } - - } - } -} diff --git a/Tests/terminalIntegrationTests/Fixtures/HealthMonitor_FixtureData.cs b/Tests/terminalIntegrationTests/Fixtures/HealthMonitor_FixtureData.cs index ecad39b32e..08d7f38919 100644 --- a/Tests/terminalIntegrationTests/Fixtures/HealthMonitor_FixtureData.cs +++ b/Tests/terminalIntegrationTests/Fixtures/HealthMonitor_FixtureData.cs @@ -31,7 +31,7 @@ public static PlanDO TestPlan_CanCreate(string name) Id = Guid.NewGuid(), Description = name, Name = name, - PlanState = PlanState.Running, + PlanState = PlanState.Executing, }; return curPlanDO; } diff --git a/Tests/terminalIntegrationTests/Integration/MonitorTerminalSubmissionPlanTest.cs b/Tests/terminalIntegrationTests/Integration/MonitorTerminalSubmissionPlanTest.cs index bffa195d78..327da95a5c 100644 --- a/Tests/terminalIntegrationTests/Integration/MonitorTerminalSubmissionPlanTest.cs +++ b/Tests/terminalIntegrationTests/Integration/MonitorTerminalSubmissionPlanTest.cs @@ -2,7 +2,6 @@ using Data.Entities; using Data.Interfaces; using Fr8.Infrastructure.Data.DataTransferObjects; -using Fr8.Infrastructure.Utilities; using Fr8.Testing.Integration; using NUnit.Framework; using StructureMap; @@ -10,23 +9,17 @@ using System.Collections.Generic; using System.Linq; using System.Net.Http; -using System.Text; using System.Threading.Tasks; -using terminalGoogle.Services; using Newtonsoft.Json; using Fr8.TerminalBase.Models; using Newtonsoft.Json.Linq; -using Fr8.TerminalBase.Interfaces; using System.Diagnostics; using System.Configuration; using AutoMapper; using Fr8.Infrastructure.Data.Manifests; using Fr8.Infrastructure.Data.Crates; using Fr8.Infrastructure.Data.Control; -using Fr8.Infrastructure.Data.Managers; using Fr8.TerminalBase.Infrastructure; -using System.Web; -using terminalIntegrationTests.Fixtures; namespace terminalIntegrationTests.Integration { @@ -41,8 +34,8 @@ public override string TerminalName } } - private readonly string jiraToken = @"{""Terminal"":null,""Username"":""fr8_atlassian_test@fr8.co"",""Password"":""shoggoth34"",""Domain"":""https://maginot.atlassian.net"",""IsDemoAccount"":false}"; - + private static string AtlassianAccountId = ConfigurationManager.AppSettings["AtlassianTestAccountId"]; + private static string AtlassianAccountPassword = ConfigurationManager.AppSettings["AtlassianTestAccountPassword"]; private const int MaxAwaitPeriod = 45000; private const int SingleAwaitPeriod = 3000; private const int PlanExecutionPeriod = 10000; @@ -54,11 +47,38 @@ public static string SlackAuthToken return ConfigurationManager.AppSettings["SlackAuthToken"]; } } + public static string SlackExternalDomainId + { + get + { + return ConfigurationManager.AppSettings["SlackExternalDomainId"]; + } + } + public static string AtlassianToken + { + get + { + return "{\"Terminal\":null,\"Username\":\"" + AtlassianAccountId + "\",\"Password\":\"" + AtlassianAccountPassword + "\",\"Domain\":\"https://maginot.atlassian.net\",\"IsDemoAccount\":false}"; + } + } + public static string GoogleAuthToken + { + get + { + return ConfigurationManager.AppSettings["GoogleTestAccountToken"]; + } + } + public static string GoogleTestAccountId + { + get + { + return ConfigurationManager.AppSettings["GoogleTestAccountId"]; + } + } - - [Test, Ignore("Is being resolved with 4692")] + [Test] public async Task MonitorTerminalSubmissionPlan() { AutoMapperBootstrapper.ConfigureAutoMapper(); @@ -111,7 +131,7 @@ public async Task MonitorTerminalSubmissionPlan() await Task.Delay(PlanExecutionPeriod); - Jira jira = CreateRestClient(jiraToken); + Jira jira = CreateRestClient(AtlassianToken); Issue[] issues = new Issue[0]; var slackUrl = "https://slack.com/api/search.messages?token=" + SlackAuthToken + "&query=" + guidTestId.ToString(); @@ -186,8 +206,8 @@ private string AddTokens() string userId = ""; var tokenADO = new AuthorizationTokenDO() { - Token = jiraToken, - ExternalAccountId = "fr8_atlassian_test@fr8.co", + Token = AtlassianToken, + ExternalAccountId = AtlassianAccountId, CreateDate = DateTime.Now, ExpiresAt = DateTime.Now.AddHours(1), Id = Guid.NewGuid() @@ -195,8 +215,8 @@ private string AddTokens() var tokenGDO = new AuthorizationTokenDO() { - Token = @"{""AccessToken"":""ya29.CjHXAnhqySXYWbq-JE3Nqpq18L_LGYw3xx_T-lD6jeQd6C2mMoKzQhTWRWFSkPcX-pH_"",""RefreshToken"":""1/ZmUihiXxjwiVd-kQe46hDXKB95VaHM5yP-6bfrS-EUUMEudVrK5jSpoR30zcRFq6"",""Expires"":""2017-11-28T13:29:12.653075+05:00""}", - ExternalAccountId = "fr8test1@gmail.com", + Token = GoogleAuthToken, + ExternalAccountId = GoogleTestAccountId, CreateDate = DateTime.Now, ExpiresAt = DateTime.Now.AddHours(1), Id = Guid.NewGuid() @@ -207,7 +227,7 @@ private string AddTokens() Token = SlackAuthToken, ExternalAccountId = "not_user", ExternalAccountName = "not_user", - ExternalDomainId = "T07F83QLE", + ExternalDomainId = SlackExternalDomainId, ExternalDomainName = "Fr8", CreateDate = DateTime.Now, ExpiresAt = DateTime.Now.AddHours(1), diff --git a/Tests/terminalIntegrationTests/Integration/PlanDirectory_Tests.cs b/Tests/terminalIntegrationTests/Integration/PlanDirectory_Tests.cs index 73342bcf01..8a15233651 100644 --- a/Tests/terminalIntegrationTests/Integration/PlanDirectory_Tests.cs +++ b/Tests/terminalIntegrationTests/Integration/PlanDirectory_Tests.cs @@ -67,6 +67,7 @@ public async Task PlanDirectory_PlanTemplateApi_Create_Update_Extract() finally { await HttpDeleteAsync(_baseUrl + "plan_templates/?id=" + planTemplateDTO.ParentPlanId.ToString()); + } } @@ -74,18 +75,19 @@ public async Task PlanDirectory_PlanTemplateApi_Create_Update_Extract() public async Task PlanDirectory_CreatePlan() { var planTemplateDTO = PlanTemplateDTO_1(); - await HttpPostAsync(_baseUrl + "plan_templates/", planTemplateDTO); + var result = await HttpPostAsync(_baseUrl + "plan_templates/", planTemplateDTO); try { - await AuthenticateWebApi("IntegrationTestUser1", "fr8#s@lt!"); + // TODO: use another test user + //await AuthenticateWebApi("IntegrationTestUser1", "fr8#s@lt!"); var createPlanResult = await HttpPostAsync( _baseUrl + "plan_templates/createplan?id=" + planTemplateDTO.ParentPlanId.ToString(), null); Assert.NotNull(createPlanResult, "Failed to create plan."); - var redirectUrl = createPlanResult["RedirectUrl"].Value(); + var redirectUrl = createPlanResult["redirectUrl"].Value(); Assert.IsNotEmpty(redirectUrl, "CreatePlan response does not contain RedirectUrl property."); var planId = ExtractPlanIdFromRedirectUrl(redirectUrl); @@ -95,10 +97,11 @@ public async Task PlanDirectory_CreatePlan() Assert.NotNull(plan, "Created plan was not found"); Assert.AreEqual(planTemplateDTO.Name, plan.Name, "Created plan was not found"); - var user2 = uow.UserRepository.GetQuery() - .FirstOrDefault(x => x.UserName == "IntegrationTestUser1"); - Assert.NotNull(user2, "IntegrationTestUser1 was not found."); - Assert.AreEqual(user2.Id, plan.Fr8AccountId, "Created plan does not belong to IntegrationTestUser1"); + // TODO: another user? + //var user2 = uow.UserRepository.GetQuery() + // .FirstOrDefault(x => x.UserName == "IntegrationTestUser1"); + //Assert.NotNull(user2, "IntegrationTestUser1 was not found."); + //Assert.AreEqual(user2.Id, plan.Fr8AccountId, "Created plan does not belong to IntegrationTestUser1"); } } finally diff --git a/Tests/terminalIntegrationTests/LICENSE b/Tests/terminalIntegrationTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalIntegrationTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalIntegrationTests/Unit/PageGeneratorTests.cs b/Tests/terminalIntegrationTests/Unit/PageGeneratorTests.cs index 5113371096..219d293ce1 100644 --- a/Tests/terminalIntegrationTests/Unit/PageGeneratorTests.cs +++ b/Tests/terminalIntegrationTests/Unit/PageGeneratorTests.cs @@ -1,11 +1,12 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Data.Entities; using Data.Repositories; using Fr8.Infrastructure.Data.DataTransferObjects; using Fr8.Infrastructure.Data.Manifests; +using Hub.Services.PlanDirectory; using Moq; using NUnit.Framework; -using PlanDirectory.Infrastructure; using Ploeh.AutoFixture; namespace terminalIntegrationTests.Unit @@ -19,19 +20,19 @@ public void ShouldGeneratePagesFromTags() // Fixture setup Fixture fixture = new Fixture(); - var wsDTO1 = fixture.Build() - .With(x => x.Id, 1) + var wsDTO1 = fixture.Build() + .With(x => x.Id, Guid.Parse("9150ADCC-9996-44BF-A497-8993E51F5D37")) .With(x => x.Name, "Excel") .With(x => x.IconPath, @"/Content/icons/web_services/ms-excel-icon-64x64.png") .Create(); - var wsDTO2 = fixture.Build() - .With(x => x.Id, 1) + var wsDTO2 = fixture.Build() + .With(x => x.Id, Guid.Parse("6ABAD1CE-A41A-4098-95B9-9C8F0B589738")) .With(x => x.Name, "Slack") .With(x => x.IconPath, @"/Content/icons/web_services/slack-icon-64x64.png") .Create(); - var tag1 = new WebServiceTemplateTag(new List { wsDTO1 }); - var tag2 = new WebServiceTemplateTag(new List { wsDTO2, wsDTO1 }); + var tag1 = new WebServiceTemplateTag(new List { wsDTO1 }); + var tag2 = new WebServiceTemplateTag(new List { wsDTO2, wsDTO1 }); var pageDefinitionRepositoryStub = new Mock(); diff --git a/Tests/terminalIntegrationTests/app.config b/Tests/terminalIntegrationTests/app.config index 8770e824e7..17301c439c 100644 --- a/Tests/terminalIntegrationTests/app.config +++ b/Tests/terminalIntegrationTests/app.config @@ -4,9 +4,6 @@
- - - diff --git a/Tests/terminalIntegrationTests/terminalIntegrationTests.csproj b/Tests/terminalIntegrationTests/terminalIntegrationTests.csproj index 4215b4c4f2..be2cca6f95 100644 --- a/Tests/terminalIntegrationTests/terminalIntegrationTests.csproj +++ b/Tests/terminalIntegrationTests/terminalIntegrationTests.csproj @@ -1,4 +1,4 @@ - + Debug @@ -285,7 +285,6 @@ - @@ -297,6 +296,7 @@ + @@ -316,10 +316,6 @@ {9891496c-8512-4708-925a-ee9d0f9199d4} Hub - - {2b78433b-ba79-470b-bef6-dba5c1904865} - PlanDirectory - {d019b112-55a8-4661-aff5-329f998d9e28} terminalAzure @@ -393,13 +389,17 @@ - $(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalFr8Core\bin\terminalFr8Core.dll.config $(TargetDir) /C /Y -$(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalDocuSign\bin\terminalDocuSign.dll.config $(TargetDir) /C /Y -$(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalAzure\bin\terminalAzure.dll.config $(TargetDir) /C /Y -$(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalFr8Core\bin\terminalFr8Core.dll.config $(TargetDir) /C /Y -$(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalExcel\bin\terminalExcel.dll.config $(TargetDir) /C /Y -$(SolutionDir)BuildUtils\xcopy.exe $(SolutionDir)terminalGoogle\bin\terminalGoogle.dll.config $(TargetDir) /C /Y - + $(SolutionDir)terminalFr8Core\bin\terminalFr8Core.dll.config + $(SolutionDir)terminalDocuSign\bin\terminalDocuSign.dll.config + $(SolutionDir)terminalAzure\bin\terminalAzure.dll.config + $(SolutionDir)terminalFr8Core\bin\terminalFr8Core.dll.config + $(SolutionDir)terminalExcel\bin\terminalExcel.dll.config + $(SolutionDir)terminalGoogle\bin\terminalGoogle.dll.config + + + + + - + diff --git a/Tests/terminalTest/terminalTest.csproj b/Tests/terminalTest/terminalTest.csproj index 449f3d22ee..bfe843cb35 100644 --- a/Tests/terminalTest/terminalTest.csproj +++ b/Tests/terminalTest/terminalTest.csproj @@ -276,6 +276,7 @@ Designer + Web.config diff --git a/Tests/terminalTwilioTests/LICENSE b/Tests/terminalTwilioTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalTwilioTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalTwilioTests/terminalTwilioTests.csproj b/Tests/terminalTwilioTests/terminalTwilioTests.csproj index 5cb4c943df..aeb535251b 100644 --- a/Tests/terminalTwilioTests/terminalTwilioTests.csproj +++ b/Tests/terminalTwilioTests/terminalTwilioTests.csproj @@ -190,6 +190,7 @@ Designer + diff --git a/Tests/terminalYammerTests/LICENSE b/Tests/terminalYammerTests/LICENSE new file mode 100644 index 0000000000..0444cdaaa8 --- /dev/null +++ b/Tests/terminalYammerTests/LICENSE @@ -0,0 +1,180 @@ + Common Public Attribution License Version 1.0 (CPAL-1.0) + Fr8 is copyright 2016 by The Fr8 Company. All Rights Reserved. + + The code in this Terminal project uses the following Common Public Attribution License Version 1.0 (CPAL-1.0) + + 1. “Definitions” + + 1.0.1 “Commercial Use” means distribution or otherwise making the Covered Code available to a third party. + + 1.1 “Contributor” means each entity that creates or contributes to the creation of Modifications. + + 1.2 “Contributor Version” means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3 “Covered Code” means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4 “Electronic Distribution Mechanism” means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5 “Executable” means Covered Code in any form other than Source Code. + + 1.6 “Initial Developer” means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7 “Larger Work” means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8 “License” means this document. + + 1.8.1 “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9 “Modifications” means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: + + A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. + B. Any new file that contains any part of the Original Code or previous Modifications. + + 1.10 “Original Code” means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1 “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11 “Source Code” means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor’s choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12 “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + + 2. Source Code License. + + 2.1 The Initial Developer Grant. + + The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2 Contributor Grant. + + Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + + 3. Distribution Obligations. + + 3.1 Application of License. + + The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients’ rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2 Availability of Source Code. + + Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3 Description of Modifications. + + You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4 Intellectual Property Matters + + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party’s intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled “LEGAL” which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + (b) Contributor APIs. + If Contributor’s Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor’s Modifications are Contributor’s original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5 Required Notices. + + You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients’ rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6 Distribution of Executable Versions. + + You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients’ rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient’s rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer, Original Developer or any Contributor. You hereby agree to indemnify the Initial Developer, Original Developer and every Contributor for any liability incurred by the Initial Developer, Original Developer or such Contributor as a result of any such terms You offer. + + 3.7 Larger Works. + + You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + + 4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + + 5. Application of this License. + + This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + + 6. Versions of the License. + + 6.1 New Versions. + + Socialtext, Inc. (“Socialtext”) may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2 Effect of New Versions. + + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Socialtext. No one other than Socialtext has the right to modify the terms applicable to Covered Code created under this License. + + 6.3 Derivative Works. + + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases “Socialtext”, “CPAL” or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the CPAL. (Filling in the name of the Initial Developer, Original Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + + 7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER, ORIGINAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + + 8. TERMINATION. + + 8.1 This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2 If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer, Original Developer or a Contributor (the Initial Developer, Original Developer or Contributor against whom You file such action is referred to as “Participant”) alleging that: + + (a) such Participant’s Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + (b) any software, hardware, or device, other than such Participant’s Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3 If You assert a patent infringement claim against Participant alleging that such Participant’s Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4 In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + + 9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ORIGINAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + + 10. U.S. GOVERNMENT END USERS. + + The Covered Code is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” and “commercial computer software documentation,” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + + 11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + + 12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer, Original Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer, Original Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + + 13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as Multiple-Licensed. Multiple-Licensed means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the CPAL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + + 14. ADDITIONAL TERM: ATTRIBUTION + + (a) As a modest attribution to the organizer of the development of the Original Code (“Original Developer”), in the hope that its promotional value may help justify the time, money and effort invested in writing the Original Code, the Original Developer may include in Exhibit B (“Attribution Information”) a requirement that each time an Executable and Source Code or a Larger Work is launched or initially run (which includes initiating a session), a prominent display of the Original Developer’s Attribution Information (as defined below) must occur on the graphic user interface employed by the end user to access such Covered Code (which may include display on a splash screen), if any. The size of the graphic image should be consistent with the size of the other elements of the Attribution Information. If the access by the end user to the Executable and Source Code does not create a graphic user interface for access to the Covered Code, this obligation shall not apply. If the Original Code displays such Attribution Information in a particular form (such as in the form of a splash screen, notice at login, an “about” display, or dedicated attribution area on user interface screens), continued use of such form for that Attribution Information is one way of meeting this requirement for notice. + (b) Attribution information may only include a copyright notice, a brief phrase, graphic image and a URL (“Attribution Information”) and is subject to the Attribution Limits as defined below. For these purposes, prominent shall mean display for sufficient duration to give reasonable notice to the user of the identity of the Original Developer and that if You include Attribution Information or similar information for other parties, You must ensure that the Attribution Information for the Original Developer shall be no less prominent than such Attribution Information or similar information for the other party. For greater certainty, the Original Developer may choose to specify in Exhibit B below that the above attribution requirement only applies to an Executable and Source Code resulting from the Original Code or any Modification, but not a Larger Work. The intent is to provide for reasonably modest attribution, therefore the Original Developer cannot require that You display, at any time, more than the following information as Attribution Information: (a) a copyright notice including the name of the Original Developer; (b) a word or one phrase (not exceeding 10 words); (c) one graphic image provided by the Original Developer; and (d) a URL (collectively, the “Attribution Limits”). + (c) If Exhibit B does not include any Attribution Information, then there are no requirements for You to display any Attribution Information of the Original Developer. + (d) You acknowledge that all trademarks, service marks and/or trade names contained within the Attribution Information distributed with the Covered Code are the exclusive property of their owners and may only be used with the permission of their owners, or under circumstances otherwise permitted by law or as expressly set out in this License. + + 15. ADDITIONAL TERM: NETWORK USE. + + The term “External Deployment” means the use, distribution, or communication of the Original Code or Modifications in any way such that the Original Code or Modifications may be used by anyone other than You, whether those works are distributed or communicated to those persons or made available as an application intended for use over a network. As an express condition for the grants of license hereunder, You must treat any External Deployment by You of the Original Code or Modifications as a distribution under section 3.1 and make Source Code available under Section 3.2. + EXHIBIT A. Common Public Attribution License Version 1.0. + “The contents of this file are subject to the Common Public Attribution License Version 1.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at __fr8.co/terminal_license___________. The License is based on the Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover use of software over a computer network and provide for limited attribution for the Original Developer. In addition, Exhibit A has been modified to be consistent with Exhibit B. + Software distributed under the License is distributed on an “AS IS” basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + The Original Code is____Fr8 Terminal Code__________________. + The Original Developer is not the Initial Developer and is __________. If left blank, the Original Developer is the Initial Developer. + The Initial Developer of the Original Code is ___The Fr8 Company_________. All portions of the code written by __The Fr8 Company_________ are Copyright (c) __2016___. All Rights Reserved. + Contributor ______________________. + Alternatively, the contents of this file may be used under the terms of the _____ license (the [___] License), in which case the provisions of [______] License are applicable instead of those above. + If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the CPAL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the CPAL or the [___] License.” + [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] + EXHIBIT B. Attribution Information + Attribution Copyright Notice: _____This uses code from a Fr8 Terminal__________________ + Attribution Phrase (not exceeding 10 words): _______________________ + Attribution URL: _______________________ + Graphic Image as provided in the Covered Code, if any. + Display of Attribution Information is [required/not required] in Larger Works which are defined in the CPAL as a work which combines Covered Code or portions thereof with code not governed by the terms of the CPAL. \ No newline at end of file diff --git a/Tests/terminalYammerTests/app.config b/Tests/terminalYammerTests/app.config index c1d5f01003..580e89a84c 100644 --- a/Tests/terminalYammerTests/app.config +++ b/Tests/terminalYammerTests/app.config @@ -7,7 +7,7 @@ - + diff --git a/Tests/terminalYammerTests/terminalYammerTests.csproj b/Tests/terminalYammerTests/terminalYammerTests.csproj index 4e9e0ad83b..a8c39d6c99 100644 --- a/Tests/terminalYammerTests/terminalYammerTests.csproj +++ b/Tests/terminalYammerTests/terminalYammerTests.csproj @@ -182,6 +182,7 @@ Designer + diff --git a/ViewModels/NavLinks.cs b/ViewModels/NavLinks.cs index 43a6b38764..fa2355bb35 100644 --- a/ViewModels/NavLinks.cs +++ b/ViewModels/NavLinks.cs @@ -21,6 +21,6 @@ public static string BaseUrl } public static string Blog = "http://blog.fr8.co"; public static string Developers = "https://github.com/Fr8org/Fr8Core/blob/master/Docs/Home.md"; - public static string PlanDirectory = ConfigurationManager.AppSettings["PlanDirectoryUrl"]; + public static string PlanDirectory = ConfigurationManager.AppSettings["PlanDirectoryUrl"] + "/plan_directory/"; } } \ No newline at end of file diff --git a/Views/AngularTemplate/ActionPicker.cshtml b/Views/AngularTemplate/ActionPicker.cshtml index 3d38585baf..3bc3449bae 100644 --- a/Views/AngularTemplate/ActionPicker.cshtml +++ b/Views/AngularTemplate/ActionPicker.cshtml @@ -1,7 +1,7 @@  diff --git a/Views/AngularTemplate/ActionPickerPanel.cshtml b/Views/AngularTemplate/ActionPickerPanel.cshtml index e3720bdefe..fe169c0e11 100644 --- a/Views/AngularTemplate/ActionPickerPanel.cshtml +++ b/Views/AngularTemplate/ActionPickerPanel.cshtml @@ -29,7 +29,7 @@
  • - + {{at.label}} diff --git a/Views/AngularTemplate/ActivityHeader.cshtml b/Views/AngularTemplate/ActivityHeader.cshtml index ca40b93923..80a132c5b6 100644 --- a/Views/AngularTemplate/ActivityHeader.cshtml +++ b/Views/AngularTemplate/ActivityHeader.cshtml @@ -8,8 +8,8 @@

    - {{envelope.activity.name}} - {{envelope.activity.name}} + {{envelope.activityTemplate.label}} + {{envelope.activityTemplate.label}}

    {{envelope.activity.label}} @@ -20,7 +20,7 @@
    updating
    - {{envelope.activity.name}} + {{envelope.activityTemplate.label}}
    @@ -37,7 +37,7 @@ - Reconfigure + Refresh diff --git a/Views/AngularTemplate/ConfigurationControl.cshtml b/Views/AngularTemplate/ConfigurationControl.cshtml index 3cf610d747..359ba060e8 100644 --- a/Views/AngularTemplate/ConfigurationControl.cshtml +++ b/Views/AngularTemplate/ConfigurationControl.cshtml @@ -15,7 +15,6 @@
    - {{plan.planState}} @@ -38,13 +37,13 @@
    - +
    - +
    @@ -117,22 +116,22 @@
    - +
    - +
    - +
    - +
    @@ -148,7 +147,7 @@
    - +
    @@ -174,7 +173,7 @@
    - +
    diff --git a/Views/AngularTemplate/ContainerTransition.cshtml b/Views/AngularTemplate/ContainerTransition.cshtml index 07427a717b..041a4be8f8 100644 --- a/Views/AngularTemplate/ContainerTransition.cshtml +++ b/Views/AngularTemplate/ContainerTransition.cshtml @@ -24,6 +24,9 @@
    +
    +
    {{transition.errorMessage}}
    +

    diff --git a/Views/AngularTemplate/DesignerHeader.cshtml b/Views/AngularTemplate/DesignerHeader.cshtml index 61087db974..6eff559f6d 100644 --- a/Views/AngularTemplate/DesignerHeader.cshtml +++ b/Views/AngularTemplate/DesignerHeader.cshtml @@ -24,10 +24,10 @@ View: - Activities + Activities - Settings + Settings
@@ -35,18 +35,22 @@
- Saving Changes... + Saving Changes... - + Ready - + - + + {{plan.planState | PlanState}} + + {{plan.planState | PlanState}} - - + + + stop diff --git a/Views/AngularTemplate/HeaderNav.cshtml b/Views/AngularTemplate/HeaderNav.cshtml index b3f63ece8e..97302f739e 100644 --- a/Views/AngularTemplate/HeaderNav.cshtml +++ b/Views/AngularTemplate/HeaderNav.cshtml @@ -42,7 +42,8 @@ @@ -72,7 +73,7 @@ diff --git a/Views/Shared/_HomePage.cshtml b/Views/Shared/_HomePage.cshtml index b1eb17af3e..4ce2380e14 100644 --- a/Views/Shared/_HomePage.cshtml +++ b/Views/Shared/_HomePage.cshtml @@ -11,7 +11,7 @@ - fr8 + The Fr8 Company: Open iPaaS @@ -82,7 +82,6 @@ window.analytics.page('Visited Page - Home'); } - - diff --git a/Views/Shared/_Layout.cshtml b/Views/Shared/_Layout.cshtml index 3655de0401..ac799200ca 100644 --- a/Views/Shared/_Layout.cshtml +++ b/Views/Shared/_Layout.cshtml @@ -5,7 +5,7 @@ - @ViewBag.Title - Dockyard + @ViewBag.Title - Fr8 @Styles.Render("~/bundles/css/bootstrap30") @Styles.Render("~/bundles/css/backendcss") @@ -22,7 +22,6 @@ -