public virtual void OnAppStartup()
        {
            AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            string jobSchedulerDbConnectionString = activeAppEnvironment.GetConfig <string>("JobSchedulerDbConnectionString");

            SqlServerStorage storage = new SqlServerStorage(jobSchedulerDbConnectionString, new SqlServerStorageOptions
            {
                PrepareSchemaIfNecessary = false,
#if NET461
                TransactionIsolationLevel = IsolationLevel.ReadCommitted,
#else
                TransactionIsolationLevel = System.Data.IsolationLevel.ReadCommitted,
#endif
                SchemaName = "Jobs"
            });

            if (activeAppEnvironment.HasConfig("JobSchedulerAzureServiceBusConnectionString"))
            {
                string signalRAzureServiceBusConnectionString = activeAppEnvironment.GetConfig <string>("JobSchedulerAzureServiceBusConnectionString");

                storage.UseServiceBusQueues(signalRAzureServiceBusConnectionString);
            }

            GlobalConfiguration.Configuration.UseStorage(storage);
            GlobalConfiguration.Configuration.UseAutofacActivator(_lifetimeScope);
            GlobalConfiguration.Configuration.UseLogProvider(LogProvider);

            _backgroundJobServer = new BackgroundJobServer(new BackgroundJobServerOptions
            {
                Activator = JobActivator
            }, storage);
        }
        public virtual void OnAppStartup()
        {
            TemplateServiceConfiguration config = new TemplateServiceConfiguration();

            AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            config.Debug                = activeAppEnvironment.DebugMode;
            config.Language             = Language.CSharp;
            config.EncodedStringFactory = new NullCompatibleEncodedStringFactory();

            IRazorEngineService service = RazorEngineService.Create(config);

            Engine.Razor = service;

            string defaultPageTemplateFilePath = PathProvider.StaticFileMapPath(activeAppEnvironment.GetConfig("DefaultPageTemplatePath", "defaultPageTemplate.cshtml"));

            if (File.Exists(defaultPageTemplateFilePath))
            {
                string defaultPageTemplateContents = File.ReadAllText(defaultPageTemplateFilePath);

                Engine.Razor.Compile(name: "defaultPageTemplate", modelType: typeof(IDependencyResolver),
                                     templateSource: new LoadedTemplateSource(defaultPageTemplateContents, defaultPageTemplateFilePath));
            }

            string ssoPageTemplateFilePath = PathProvider.StaticFileMapPath(activeAppEnvironment.GetConfig("SsoPageTemplatePath", "ssoPageTemplate.cshtml"));

            if (File.Exists(ssoPageTemplateFilePath))
            {
                string ssoPageTemplateContents = File.ReadAllText(ssoPageTemplateFilePath);

                Engine.Razor.Compile(name: "ssoPageTemplate", modelType: typeof(IDependencyResolver),
                                     templateSource: new LoadedTemplateSource(ssoPageTemplateContents, ssoPageTemplateFilePath));
            }
        }
        public virtual async Task <DefaultPageModel> GetDefaultPageModelAsync(CancellationToken cancellationToken)
        {
            AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            DefaultPageModel defaultPageModel = new DefaultPageModel
            {
                AppVersion = activeAppEnvironment.AppInfo.Version,
                DebugMode  = activeAppEnvironment.DebugMode,
                AppName    = activeAppEnvironment.AppInfo.Name
            };

            UserSetting userSetting = UsersSettingsProvider == null ? null : await UsersSettingsProvider.GetCurrentUserSettingAsync(cancellationToken).ConfigureAwait(false);

            string theme = userSetting?.Theme ?? activeAppEnvironment.AppInfo.DefaultTheme;

            string culture = userSetting?.Culture ?? activeAppEnvironment.AppInfo.DefaultCulture;

            string desiredTimeZone = userSetting?.DesiredTimeZone ??
                                     activeAppEnvironment.AppInfo.DefaultTimeZone;

            string desiredTimeZoneValue = null;

            if (culture == null || string.Equals(culture, "Auto", StringComparison.OrdinalIgnoreCase))
            {
                culture = "EnUs";
            }

            if (desiredTimeZone != null &&
                !string.Equals(desiredTimeZone, "Auto", StringComparison.CurrentCulture))
            {
                desiredTimeZoneValue = desiredTimeZone;
            }

            string appTitle = activeAppEnvironment.Cultures.Any() ? activeAppEnvironment.Cultures
                              .ExtendedSingle($"Finding culture {culture} in environment {activeAppEnvironment.Name}", c => c.Name == culture).Values.ExtendedSingle($"Finding AppTitle in culture {culture}", v =>
                                                                                                                                                                     string.Equals(v.Name, "AppTitle", StringComparison.OrdinalIgnoreCase)).Title : string.Empty;

            defaultPageModel.AppTitle             = appTitle;
            defaultPageModel.Culture              = culture;
            defaultPageModel.DesiredTimeZoneValue = desiredTimeZoneValue;
            defaultPageModel.Theme = theme;

            defaultPageModel.EnvironmentConfigsJson = ContentFormatter.Serialize(activeAppEnvironment
                                                                                 .Configs.Where(c => c.AccessibleInClientSide == true)
                                                                                 .Select(c => new { value = c.Value, key = c.Key }));

            defaultPageModel.BaseHref = activeAppEnvironment.GetHostVirtualPath();

            return(defaultPageModel);
        }
Esempio n. 4
0
        public virtual X509Certificate2 GetSingleSignOnCertificate()
        {
            if (_certificate == null)
            {
                AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

                string password = activeAppEnvironment
                                  .GetConfig <string>("IdentityCertificatePassword");

                _certificate = new X509Certificate2(File.ReadAllBytes(PathProvider.MapPath(activeAppEnvironment.GetConfig("IdentityServerCertificatePath", "IdentityServerCertificate.pfx"))),
                                                    password);
            }

            return(_certificate);
        }
Esempio n. 5
0
        public async Task <IEnumerable <CityDto> > GetAll(CancellationToken cancellationToken)
        {
            ODataSqlQuery odataSqlQuery = ODataSqlBuilder.BuildSqlQuery(GetODataQueryOptions(), tableName: "bit.Cities");

            string connectionString = AppEnvironmentProvider.GetActiveAppEnvironment().GetConfig <string>("BitChangeSetManagerDbConnectionString");

            DbConnection dbConnection = await DbConnectionProvider.GetDbConnectionAsync(connectionString, true, cancellationToken);

            DbTransaction dbTransaction = DbConnectionProvider.GetDbTransaction(connectionString);

            IEnumerable <CityDto> cities = await dbConnection.QueryAsync <CityDto>(odataSqlQuery.SelectQuery, odataSqlQuery.Parts.Parameters, transaction : dbTransaction);

            long total = odataSqlQuery.Parts.GetTotalCountFromDb == false?cities.LongCount() : ((await dbConnection.ExecuteScalarAsync <long?>(odataSqlQuery.SelectTotalCountQuery, odataSqlQuery.Parts.Parameters, transaction: dbTransaction)) ?? 0);

            Request.Properties["System.Web.OData.TotalCountFunc"] = new Func <long>(() => total);

            return(cities);
        }
Esempio n. 6
0
        public virtual void Configure(IAppBuilder owinApp)
        {
            AppEnvironment appEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            string rootFolder = PathProvider.GetCurrentStaticFilesPath();

            PhysicalFileSystem fileSystem = new PhysicalFileSystem(rootFolder);

            FileServerOptions options = new FileServerOptions
            {
                EnableDirectoryBrowsing = appEnvironment.DebugMode,
                EnableDefaultFiles      = false
            };

            options.DefaultFilesOptions.DefaultFileNames.Clear();

            options.FileSystem = fileSystem;

            string path = $@"/Files/V{appEnvironment.AppInfo.Version}";

            owinApp.Map(path, innerApp =>
            {
                if (appEnvironment.DebugMode == true)
                {
                    innerApp.Use <OwinNoCacheResponseMiddleware>();
                }
                else
                {
                    innerApp.Use <OwinCacheResponseMiddleware>();
                }
                innerApp.UseXContentTypeOptions();
                innerApp.UseXDownloadOptions();
                innerApp.UseFileServer(options);
            });

            owinApp.Map("/Files", innerApp =>
            {
                innerApp.Use <OwinNoCacheResponseMiddleware>();
                innerApp.UseXContentTypeOptions();
                innerApp.UseXDownloadOptions();
                innerApp.UseFileServer(options);
            });
        }
Esempio n. 7
0
        public virtual void Configure(IApplicationBuilder aspNetCoreApp)
        {
            AppEnvironment appEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            FileServerOptions options = new FileServerOptions
            {
                EnableDirectoryBrowsing = appEnvironment.DebugMode,
                EnableDefaultFiles      = false
            };

            options.DefaultFilesOptions.DefaultFileNames.Clear();

            options.FileProvider = HostingEnvironment.WebRootFileProvider;

            string path = $@"/Files/V{appEnvironment.AppInfo.Version}";

            aspNetCoreApp.Map(path, innerApp =>
            {
                if (appEnvironment.DebugMode == true)
                {
                    innerApp.UseMiddleware <AspNetCoreNoCacheResponseMiddleware>();
                }
                else
                {
                    innerApp.UseMiddleware <AspNetCoreCacheResponseMiddleware>();
                }
                innerApp.UseXContentTypeOptions();
                innerApp.UseXDownloadOptions();
                innerApp.UseFileServer(options);
            });

            aspNetCoreApp.Map("/Files", innerApp =>
            {
                innerApp.UseMiddleware <AspNetCoreNoCacheResponseMiddleware>();
                innerApp.UseXContentTypeOptions();
                innerApp.UseXDownloadOptions();
                innerApp.UseFileServer(options);
            });
        }
        public virtual void Configure(IAppBuilder owinApp)
        {
            if (owinApp == null)
            {
                throw new ArgumentNullException(nameof(owinApp));
            }

            if (PlatformUtilities.IsRunningOnDotNetCore && !PlatformUtilities.IsRunningOnMono)
            {
                TypeInfo  type = typeof(HubConfiguration).GetTypeInfo().Assembly.GetType("Microsoft.AspNet.SignalR.Infrastructure.MonoUtility").GetTypeInfo();
                FieldInfo isRunningMonoField = type.GetField("_isRunningMono", BindingFlags.NonPublic | BindingFlags.Static);
                if (isRunningMonoField != null)
                {
                    isRunningMonoField.SetValue(null, new Lazy <bool>(() => true));
                }
            }

            HubConfiguration signalRConfig = new HubConfiguration
            {
                EnableDetailedErrors    = AppEnvironmentProvider.GetActiveAppEnvironment().DebugMode == true,
                EnableJavaScriptProxies = true,
                EnableJSONP             = false,
                Resolver = DependencyResolver
            };

            SignalRScaleoutConfigurations.ToList()
            .ForEach(cnfg =>
            {
                cnfg.Configure(signalRConfig);
            });

            owinApp.Map("/signalr", innerOwinApp =>
            {
                innerOwinApp.RunSignalR(signalRConfig);
            });
        }
        public virtual IdentityServerBearerTokenAuthenticationOptions BuildIdentityServerBearerTokenAuthenticationOptions()
        {
            AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

            IdentityServerBearerTokenAuthenticationOptions authOptions = new IdentityServerBearerTokenAuthenticationOptions
            {
                ClientId                      = activeAppEnvironment.Security.ClientId,
                Authority                     = activeAppEnvironment.GetSsoUrl(),
                DelayLoadMetadata             = true,
                RequiredScopes                = activeAppEnvironment.Security.Scopes,
                ClientSecret                  = activeAppEnvironment.Security.ClientSecret,
                EnableValidationResultCache   = true,
                ValidationResultCacheDuration = TimeSpan.FromMinutes(15),
                // ValidationMode = ValidationMode.ValidationEndpoint,
                ValidationMode           = ValidationMode.Local,
                PreserveAccessToken      = true,
                SigningCertificate       = CertificateProvider.GetSingleSignOnCertificate(),
                BackchannelHttpHandler   = GetHttpClientHandler(nameof(IdentityServerBearerTokenAuthenticationOptions.BackchannelHttpHandler)),
                IntrospectionHttpHandler = GetHttpClientHandler(nameof(IdentityServerBearerTokenAuthenticationOptions.IntrospectionHttpHandler)),
                IssuerName = activeAppEnvironment.GetSsoIssuerName()
            };

            return(authOptions);
        }
Esempio n. 10
0
        public void OnAppStartup()
        {
            Database.SetInitializer <BitChangeSetManagerDbContext>(null);

            using (SqlConnection dbConnection = new SqlConnection(AppEnvironmentProvider.GetActiveAppEnvironment().GetConfig <string>("BitChangeSetManagerDbConnectionString")))
            {
                using (BitChangeSetManagerDbContext dbContext = new BitChangeSetManagerDbContext(dbConnection))
                {
                    bool newDbCreated = dbContext.Database.CreateIfNotExists();

                    dbContext.Database.Initialize(force: true);

                    if (newDbCreated == false)
                    {
                        return;
                    }
                }
            }

            using (IDependencyResolver childResolver = DependencyManager.CreateChildDependencyResolver())
            {
                IUnitOfWork unitOfWork = childResolver.Resolve <IUnitOfWork>();

                using (unitOfWork.BeginWork())
                {
                    IBitChangeSetManagerRepository <User> usersRepository = childResolver.Resolve <IBitChangeSetManagerRepository <User> >();

                    string password = "******";

                    using (MD5 md5Hash = MD5.Create())
                    {
                        byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(password));

                        StringBuilder sBuilder = new StringBuilder();

                        foreach (byte d in data)
                        {
                            sBuilder.Append(d.ToString("x2"));
                        }

                        password = sBuilder.ToString();
                    }

                    byte[] userAvatar = Convert.FromBase64String("iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAACXBIWXMAAAsTAAALEwEAmpwYAABCQWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICAgICAgICAgIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiCiAgICAgICAgICAgIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIgogICAgICAgICAgICB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRlRGF0ZT4yMDE1LTExLTIxVDE1OjI5OjI5WjwveG1wOkNyZWF0ZURhdGU+CiAgICAgICAgIDx4bXA6TW9kaWZ5RGF0ZT4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC94bXA6TW9kaWZ5RGF0ZT4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNS0xMS0yMlQxMDo0MzoyMiswNTozMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3BuZzwvZGM6Zm9ybWF0PgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpGN0NCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0xMS0yMlQwOTo0Mzo0NSswNTozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpGOENCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RFdnQ6aW5zdGFuY2VJRD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNS0xMS0yMlQwOTo0Mzo0NSswNTozMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6MTA0ZTIwYzAtMmExMi00NzgzLWExMTYtYzg5NzE2MTZiOTY4PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNvbnZlcnRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5mcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nPC9zdEV2dDpwYXJhbWV0ZXJzPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+ZGVyaXZlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6cGFyYW1ldGVycz5jb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZzwvc3RFdnQ6cGFyYW1ldGVycz4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPnNhdmVkPC9zdEV2dDphY3Rpb24+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDppbnN0YW5jZUlEPnhtcC5paWQ6NzdmNTk0MjEtMWM0Ni00OGYzLWEwYzMtNjBjZWVhM2ZjNTE4PC9zdEV2dDppbnN0YW5jZUlEPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6d2hlbj4yMDE1LTExLTIyVDEwOjQzOjIyKzA1OjMwPC9zdEV2dDp3aGVuPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6c29mdHdhcmVBZ2VudD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoTWFjaW50b3NoKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06RGVyaXZlZEZyb20gcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICA8c3RSZWY6aW5zdGFuY2VJRD54bXAuaWlkOjEwNGUyMGMwLTJhMTItNDc4My1hMTE2LWM4OTcxNjE2Yjk2ODwvc3RSZWY6aW5zdGFuY2VJRD4KICAgICAgICAgICAgPHN0UmVmOmRvY3VtZW50SUQ+eG1wLmRpZDpGN0NCMjUzMzM1MjA2ODExODIyQURDNzU2MTc0RDdBNjwvc3RSZWY6ZG9jdW1lbnRJRD4KICAgICAgICAgICAgPHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOkY3Q0IyNTMzMzUyMDY4MTE4MjJBREM3NTYxNzREN0E2PC9zdFJlZjpvcmlnaW5hbERvY3VtZW50SUQ+CiAgICAgICAgIDwveG1wTU06RGVyaXZlZEZyb20+CiAgICAgICAgIDx4bXBNTTpEb2N1bWVudElEPmFkb2JlOmRvY2lkOnBob3Rvc2hvcDplNzFkYWVjOS1kMTA4LTExNzgtOTU1NC1jMDUwNTIwYjZmMzE8L3htcE1NOkRvY3VtZW50SUQ+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6NzdmNTk0MjEtMWM0Ni00OGYzLWEwYzMtNjBjZWVhM2ZjNTE4PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06T3JpZ2luYWxEb2N1bWVudElEPnhtcC5kaWQ6RjdDQjI1MzMzNTIwNjgxMTgyMkFEQzc1NjE3NEQ3QTY8L3htcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHRpZmY6WFJlc29sdXRpb24+NzIwMDAwLzEwMDAwPC90aWZmOlhSZXNvbHV0aW9uPgogICAgICAgICA8dGlmZjpZUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WVJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOlJlc29sdXRpb25Vbml0PjI8L3RpZmY6UmVzb2x1dGlvblVuaXQ+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+NjU1MzU8L2V4aWY6Q29sb3JTcGFjZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI1NjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yNTY8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0idyI/PvH4Sk0AAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAJ79JREFUeNrsnXeYVeW5t++1y/QOM/QmfQAF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");

                    usersRepository.Add(new User {
                        Id = Guid.Parse("4eafc297-d01a-4669-be14-4e31ad4f6445"), UserName = "******", Password = password, Culture = BitCulture.EnUs, AvatarImage = userAvatar
                    });
                    usersRepository.Add(new User {
                        Id = Guid.Parse("e36499dd-10dc-452c-82ba-8686bdb8c2ae"), UserName = "******", Password = password, Culture = BitCulture.FaIr, AvatarImage = userAvatar
                    });
                    usersRepository.Add(new User {
                        Id = Guid.Parse("2438fc43-5e6a-46e2-b82d-a746dfb6877e"), UserName = "******", Password = password, Culture = BitCulture.EnUs, AvatarImage = userAvatar
                    });
                    usersRepository.Add(new User {
                        Id = Guid.Parse("051351fb-b4c5-4b4d-8f5d-202eb08af8c7"), UserName = "******", Password = password, Culture = BitCulture.FaIr, AvatarImage = userAvatar
                    });

                    IBitChangeSetManagerRepository <Customer>                     customersRepository                     = childResolver.Resolve <IBitChangeSetManagerRepository <Customer> >();
                    IBitChangeSetManagerRepository <Delivery>                     deliveriesRepository                    = childResolver.Resolve <IBitChangeSetManagerRepository <Delivery> >();
                    IBitChangeSetManagerRepository <ChangeSet>                    changeSetsRepository                    = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSet> >();
                    IBitChangeSetManagerRepository <ChangeSetSeverity>            changeSetSeveritiesRepository           = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSetSeverity> >();
                    IBitChangeSetManagerRepository <ChangeSetDeliveryRequirement> changeSetDeliveryRequirementsRepository = childResolver.Resolve <IBitChangeSetManagerRepository <ChangeSetDeliveryRequirement> >();
                    IBitChangeSetManagerRepository <Province>                     provincesRepository                     = childResolver.Resolve <IBitChangeSetManagerRepository <Province> >();
                    IBitChangeSetManagerRepository <City>     citiesRepository    = childResolver.Resolve <IBitChangeSetManagerRepository <City> >();
                    IBitChangeSetManagerRepository <Constant> constantsRepository = childResolver.Resolve <IBitChangeSetManagerRepository <Constant> >();

                    Customer customer1 = new Customer {
                        Id = Guid.NewGuid(), Name = "Customer1"
                    };
                    Customer customer2 = new Customer {
                        Id = Guid.NewGuid(), Name = "Customer2"
                    };

                    ChangeSetDeliveryRequirement changeSetDeliveryRequirement1 = new ChangeSetDeliveryRequirement {
                        Id = Guid.NewGuid(), Title = "Deliver to all developers"
                    };
                    ChangeSetDeliveryRequirement changeSetDeliveryRequirement2 = new ChangeSetDeliveryRequirement {
                        Id = Guid.NewGuid(), Title = "Deliver to technical manager"
                    };
                    ChangeSetDeliveryRequirement changeSetDeliveryRequirement3 = new ChangeSetDeliveryRequirement {
                        Id = Guid.NewGuid(), Title = "No specific delivery is required"
                    };

                    ChangeSetSeverity changeSetSeverity1 = new ChangeSetSeverity {
                        Id = Guid.NewGuid(), Title = "Low"
                    };
                    ChangeSetSeverity changeSetSeverity2 = new ChangeSetSeverity {
                        Id = Guid.NewGuid(), Title = "Medium"
                    };
                    ChangeSetSeverity changeSetSeverity3 = new ChangeSetSeverity {
                        Id = Guid.NewGuid(), Title = "High"
                    };

                    ChangeSet changeSet1 = new ChangeSet {
                        Id = Guid.NewGuid(), AssociatedCommitUrl = "http://github.com/bit-foundation/bit-framework", Description = "Desc1", Title = "ChangeSet1", DeliveryRequirementId = changeSetDeliveryRequirement1.Id, SeverityId = changeSetSeverity3.Id
                    };
                    ChangeSet changeSet2 = new ChangeSet {
                        Id = Guid.NewGuid(), AssociatedCommitUrl = "http://github.com/bit-foundation/bit-framework", Description = "Desc2", Title = "ChangeSet2", DeliveryRequirementId = changeSetDeliveryRequirement1.Id, SeverityId = changeSetSeverity3.Id
                    };

                    Delivery delivery1 = new Delivery {
                        ChangeSetId = changeSet1.Id, Id = Guid.NewGuid(), CustomerId = customer1.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime()
                    };
                    Delivery delivery2 = new Delivery {
                        ChangeSetId = changeSet1.Id, Id = Guid.NewGuid(), CustomerId = customer2.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime()
                    };
                    Delivery delivery3 = new Delivery {
                        ChangeSetId = changeSet2.Id, Id = Guid.NewGuid(), CustomerId = customer1.Id, DeliveredOn = DateTimeProvider.GetCurrentUtcDateTime()
                    };

                    Province province1 = new Province {
                        Id = Guid.NewGuid(), Name = "Province1"
                    };
                    Province province2 = new Province {
                        Id = Guid.NewGuid(), Name = "Province2"
                    };
                    Province province3 = new Province {
                        Id = Guid.NewGuid(), Name = "Province3"
                    };

                    List <City> cities = new List <City>();

                    int num = 1;

                    foreach (Province province in new[] { province1, province2, province3 })
                    {
                        for (int i = 0; i < 100; i++)
                        {
                            cities.Add(new City {
                                Id = Guid.NewGuid(), Name = $"City{num}{i}", ProvinceId = province.Id
                            });
                        }

                        num++;
                    }

                    constantsRepository.AddRange(new[]
                    {
                        new Constant {
                            Id = Guid.NewGuid(), Name = "Ans_Yes", Title = "Yes"
                        },
                        new Constant {
                            Id = Guid.NewGuid(), Name = "Ans_No", Title = "No"
                        },
                        new Constant {
                            Id = Guid.NewGuid(), Name = "Gender_Man", Title = "Man"
                        },
                        new Constant {
                            Id = Guid.NewGuid(), Name = "Gender_Woman", Title = "Woman"
                        },
                        new Constant {
                            Id = Guid.NewGuid(), Name = "Gender_Other", Title = "Other"
                        }
                    });

                    provincesRepository.AddRange(new[] { province1, province2, province3 });
                    citiesRepository.AddRange(cities);
                    customersRepository.AddRange(new[] { customer1, customer2 });
                    changeSetSeveritiesRepository.AddRange(new[] { changeSetSeverity1, changeSetSeverity2, changeSetSeverity3 });
                    changeSetDeliveryRequirementsRepository.AddRange(new[] { changeSetDeliveryRequirement1, changeSetDeliveryRequirement2, changeSetDeliveryRequirement3 });
                    changeSetsRepository.AddRange(new[] { changeSet1, changeSet2 });
                    deliveriesRepository.AddRange(new[] { delivery1, delivery2, delivery3 });

                    unitOfWork.CommitWork();
                }
            }
        }
        public virtual void Configure(IAppBuilder owinApp)
        {
            if (owinApp == null)
            {
                throw new ArgumentNullException(nameof(owinApp));
            }

            owinApp.Map("/core", coreApp =>
            {
                LogProvider.SetCurrentLogProvider(DependencyManager.Resolve <ILogProvider>());

                AppEnvironment activeAppEnvironment = AppEnvironmentProvider.GetActiveAppEnvironment();

                IdentityServerServiceFactory factory = new IdentityServerServiceFactory()
                                                       .UseInMemoryClients(DependencyManager.Resolve <IClientProvider>().GetClients().ToArray())
                                                       .UseInMemoryScopes(ScopesProvider.GetScopes());

                factory.UserService =
                    new Registration <IUserService>(DependencyManager.Resolve <IUserService>());

                factory.EventService = new Registration <IEventService>(EventService);

                factory.ViewService = new Registration <IViewService>(DependencyManager.Resolve <IViewService>());

                factory.RedirectUriValidator = new Registration <IRedirectUriValidator>(RedirectUriValidator);

                bool requireSslConfigValue = activeAppEnvironment.GetConfig("RequireSsl", defaultValueOnNotFound: false);

                string identityServerSiteName = activeAppEnvironment.GetConfig("IdentityServerSiteName", $"{activeAppEnvironment.AppInfo.Name} Identity Server");

                IdentityServerOptions identityServerOptions = new IdentityServerOptions
                {
                    SiteName           = identityServerSiteName,
                    SigningCertificate = CertificateProvider.GetSingleSignOnCertificate(),
                    Factory            = factory,
                    RequireSsl         = requireSslConfigValue,
                    EnableWelcomePage  = activeAppEnvironment.DebugMode == true,
                    IssuerUri          = activeAppEnvironment.GetSsoIssuerName(),
                    CspOptions         = new CspOptions
                    {
                        // Content security policy
                        Enabled = false
                    },
                    Endpoints = new EndpointOptions
                    {
                        EnableAccessTokenValidationEndpoint   = true,
                        EnableAuthorizeEndpoint               = true,
                        EnableCheckSessionEndpoint            = true,
                        EnableClientPermissionsEndpoint       = true,
                        EnableCspReportEndpoint               = true,
                        EnableDiscoveryEndpoint               = true,
                        EnableEndSessionEndpoint              = true,
                        EnableIdentityTokenValidationEndpoint = true,
                        EnableIntrospectionEndpoint           = true,
                        EnableTokenEndpoint           = true,
                        EnableTokenRevocationEndpoint = true,
                        EnableUserInfoEndpoint        = true
                    },
                    EventsOptions = new EventsOptions
                    {
                        RaiseErrorEvents   = true,
                        RaiseFailureEvents = true
                    }
                };

                coreApp.UseIdentityServer(identityServerOptions);
            });
        }