Beispiel #1
0
        private static void GetGroups()
        {
            using (var request = new ApiWebRequest())
            {
                var groupsData = Helper.GetJsonObjectFromFile <List <Group> >("SampleData/Groups.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Groups, groupsData[0]);
                    request.Post(RequestObject.Groups, groupsData[1]);
                    request.Post(RequestObject.Groups, groupsData[2]);
                    request.Post(RequestObject.Groups, groupsData[3]);

                    Console.WriteLine("-> Exercise Get");
                    var response = request.Get(RequestObject.Groups);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Groups, groupsData[0].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Groups, groupsData[1].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Groups, groupsData[2].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Groups, groupsData[3].Name));
                }
                );
            }
        }
        private static void GetGenericConnection()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <Connection>(PostDataFile01);

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new Generic connection");
                    request.Post(RequestObject.Connections, postData);

                    Console.WriteLine("Get Generic connection");
                    var response =
                        request.Get(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                  RequestObject.Connections, postData.Name));
                    return(response);
                },
                    () =>
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                 RequestObject.Connections, postData.Name))
                );
            }
        }
Beispiel #3
0
        private static void PutGroup()
        {
            using (var request = new ApiWebRequest())
            {
                var groupData = Helper.GetJsonObjectFromFile <Group>("SampleData/Group.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Groups, groupData);

                    Console.WriteLine("-> Exercise Put");
                    groupData.Description          = "GroupDescriptionUpdated";
                    groupData.ClaimValues[0].Value = "OrganizationAdmin";
                    groupData.ClaimValues[1].Value = "ClaimTransformationAdmin";
                    var response = request.Put(RequestObject.Groups, groupData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Groups, groupData.Name));
                }
                );
            }
        }
        private static void DeleteOrganizations()
        {
            using (var request = new ApiWebRequest())
            {
                var organizationsData = Helper.GetJsonObjectFromFile <List <Organization> >("SampleData/Organizations.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Organizations, organizationsData[0]);
                    request.Post(RequestObject.Organizations, organizationsData[1]);
                    request.Post(RequestObject.Organizations, organizationsData[2]);
                    request.Post(RequestObject.Organizations, organizationsData[3]);

                    Console.WriteLine("-> Exercise Delete many");
                    var deletedGroups = new[]
                    {
                        organizationsData[1].Name, organizationsData[2].Name, organizationsData[3].Name, organizationsData[0].Name
                    };
                    var response = request.Delete(RequestObject.OrganizationsMany, deletedGroups);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationsData[0].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationsData[1].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationsData[2].Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationsData[3].Name));
                }
                );
            }
        }
        private static void PatchConnection(string connectionName, string postDataFilePath, string patchDataFilePath)
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("-> Prepare data");
                var postData  = Helper.GetJsonObjectFromFile <Connection>(postDataFilePath);
                var patchData = Helper.GetJsonObjectFromFile <JArray>(patchDataFilePath);

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create new {0}", connectionName);
                    var response = request.Post(RequestObject.Connections, postData);

                    Console.WriteLine("-> Put to update {0}", connectionName);
                    var path = string.Join("/", RequestObject.Connections, postData.Name);
                    response = request.Patch(path, patchData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.InstalledUICulture, "{0}/{1}", RequestObject.Connections, postData.Name));
                }
                );
            }
        }
        private static void PutOneTimePasswordConnection()
        {
            using (var request = new ApiWebRequest())
            {
                var connection       = Helper.GetJsonObjectFromFile <Connection>("SampleData/OneTimePasswordConnection.json");
                var connectionUpdate = Helper.GetJsonObjectFromFile <Connection>("SampleData/OneTimePasswordConnectionUpdate.json");


                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Connections, connection);

                    Console.WriteLine("-> Exercise PUT One Time Password Connection ");
                    var response = request.Put(RequestObject.Connections, connectionUpdate);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Connections, connection.Name));
                }
                );
            }
        }
        private static void SearchUser()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData   = Helper.GetJsonObjectFromFile <User[]>(PostMassDataFile);
                var searchData = Helper.GetJsonObjectFromFile <JObject>(SearchDataFile);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new Users");
                    request.Post(RequestObject.MassUsers, postData);

                    Console.WriteLine("Search User");
                    var response = request.Post(RequestObject.UsersSearch, searchData);
                    return(response);
                },
                    () =>
                {
                    List <Guid> delData = (from user in postData select new Guid(user.Id)).ToList <Guid>();
                    request.Delete(RequestObject.MassUsers, delData);
                }
                );
            }
        }
        private static void PutMassUsers()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <User[]>(PostMassDataFile);
                var putData  = Helper.GetJsonObjectFromFile <User[]>(PutMassDataFile);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    request.Post(RequestObject.MassUsers, postData);

                    Console.WriteLine("Put Mass User");
                    HttpResponseMessage response = request.Put(RequestObject.MassUsers, putData);
                    return(response);
                },
                    () =>
                {
                    List <Guid> delData = (from user in putData select new Guid(user.Id)).ToList <Guid>();
                    request.Delete(RequestObject.MassUsers, delData);
                }
                );
            }
        }
Beispiel #9
0
        private static void PutClaimTransformationsNemIdConnection()
        {
            using (var request = new ApiWebRequest())
            {
                var connection              = Helper.GetJsonObjectFromFile <Connection>("SampleData/NemIdConnectionWithClaimTransformation.json");
                var claimTransformation     = Helper.GetJsonObjectFromFile <CreateExcludeTransformationRequest>("SampleData/ClaimTransformation.json");
                var claimTransformation1    = Helper.GetJsonObjectFromFile <CreateExcludeTransformationRequest>("SampleData/ClaimTransformation1.json");
                var putClaimTransformations = Helper.GetJsonObjectFromFile <object>("SampleData/PutClaimTransformations.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    request.Post(RequestObject.ClaimTransformationExcludeIdentify, claimTransformation);
                    request.Post(RequestObject.ClaimTransformationExcludeIdentify, claimTransformation1);
                    request.Post(RequestObject.Connections, connection);


                    Console.WriteLine("-> Exercise Put many claim transformation NemId connection");
                    var response = request.Put(RequestObject.ConnectionsClaimTransformations, putClaimTransformations);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Connections, connection.Name));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.ClaimTransformationExcludeIdentify, claimTransformation.TransformationName));
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.ClaimTransformationExcludeIdentify, claimTransformation.TransformationName));
                }
                );
            }
        }
        private static void PutOrganization()
        {
            using (var request = new ApiWebRequest())
            {
                var organizationData = Helper.GetJsonObjectFromFile <Organization>("SampleData/Organization.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Organizations, organizationData);

                    Console.WriteLine("-> Exercise Put");
                    organizationData.Description                    = "OrganizationDescriptionUpdated";
                    organizationData.DisplayName                    = "OrganizationDisplayNameUpdated";
                    organizationData.ExpiryDisallowLoginDays        = 99;
                    organizationData.ForceResetPasswordDefaultValue = true;
                    organizationData.PasswordExpiryDays             = 100;
                    var response = request.Put(RequestObject.Organizations, organizationData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationData.Name));
                }
                );
            }
        }
        private static void PutClaimDefinition()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <ClaimDefinition>(PostOneDataFile);
                var putData  = Helper.GetJsonObjectFromFile <ClaimDefinition>(PutOneDataFile);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new Claim Definition");
                    request.Post(RequestObject.ClaimDefinitions, postData);

                    Console.WriteLine("Put to update Claim Definition");
                    var response = request.Put(RequestObject.ClaimDefinitions, putData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                 RequestObject.ClaimDefinitions, postData.ClaimType));
                }
                );
            }
        }
        private static void GetFilterClaimDefinition()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <ClaimDefinition[]>(PostManyDataFile);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new Claim Definitions");
                    request.Post(RequestObject.ClaimDefinitionsMany, postData);

                    Console.WriteLine("Get Filter Claim Definition with Filter string: {0}", FilterString);
                    var response = request.Get(RequestObject.ClaimDefinitionsFilter + FilterString);
                    return(response);
                },
                    () =>
                {
                    var delData = Helper.GetJsonObjectFromFile <JArray>(DelDataFile);
                    request.Delete(
                        string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.ClaimDefinitions,
                                      RequestObject.ClaimTypes), delData);
                }
                );
            }
        }
        private static void DeleteClaimDefinitionById()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <ClaimDefinition>(PostOneDataFile);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new Claim Definition");
                    var postResponse = request.Post(RequestObject.ClaimDefinitions, postData);
                    string id        = ExtractClaimAttributeFromResult(postResponse, IdentifyJsonProperties.Id);

                    Console.WriteLine("Delete by Id Claim Definition " + postData.Name);
                    var response =
                        request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                     RequestObject.ClaimDefinitions, id));
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                 RequestObject.ClaimDefinitions, postData.ClaimType));
                }
                );
            }
        }
 private static void DeleteClaimDefinitionsManyById()
 {
     using (var request = new ApiWebRequest())
     {
         Console.WriteLine("Prepare data");
         var postData = Helper.GetJsonObjectFromFile <ClaimDefinition[]>(PostManyDataFile);
         RestApiCaller.CallAndHandleError
         (
             () =>
         {
             var postResponse = request.Post(RequestObject.ClaimDefinitionsMany, postData);
             var guids        = ExtractArrayClaimIdsFromResult(postResponse);
             Console.WriteLine("Delete Claim Definitions");
             var response = request.Delete(
                 string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.ClaimDefinitions, RequestObject.Ids), guids);
             return(response);
         },
             () =>
         {
             var delData = Helper.GetJsonObjectFromFile <JArray>(DelDataFile);
             request.Delete(
                 string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.ClaimDefinitions,
                               RequestObject.ClaimTypes), delData);
         }
         );
     }
 }
Beispiel #15
0
        private static void PutConnection(string connectionName, string postDataFilePath, string putDataFilePath)
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("-> Prepare data");
                var postData = Helper.GetJsonObjectFromFile <Connection>(postDataFilePath);
                var putData  = Helper.GetJsonObjectFromFile <JObject>(putDataFilePath);

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Post {0}", connectionName);
                    var response = request.Post(RequestObject.Connections, postData);

                    Console.WriteLine("-> Put to update {0}", connectionName);
                    response = request.Put(RequestObject.Connections, putData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.Connections, postData.Name));
                }
                );
            }
        }
        private static void PostManyCertificate(string resourceName, string postDataFilePath)
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("-> Prepare data");
                var thumprints = new List <string>();
                var postData   = Helper.GetJsonObjectFromFile <JArray>(postDataFilePath);

                foreach (var data in postData)
                {
                    var rawData = (string)data["RawData"];
                    var cert    = new X509Certificate2(Convert.FromBase64String(rawData));
                    thumprints.Add(cert.Thumbprint);
                }

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Post {0}", resourceName);
                    var response = request.Post(string.Join("/", RequestObject.Certificate, "many"), postData);
                    return(response);
                },
                    () =>
                    request.Delete(string.Join("/", RequestObject.Certificate, "many?forceDeleteInUse=true"),
                                   thumprints)
                );
            }
        }
        private static void GetCertificate(string resourceName, string postDataFilePath)
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("-> Prepare data");
                var postData = Helper.GetJsonObjectFromFile <JObject>(postDataFilePath);
                var rawData  = (string)postData["RawData"];

                var cert = new X509Certificate2(Convert.FromBase64String(rawData));
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create new {0}", resourceName);
                    var response = request.Post(RequestObject.Certificate, postData);

                    Console.WriteLine("-> Get {0}", resourceName);
                    response = request.Get(string.Join("/", RequestObject.Certificate, cert.Thumbprint));
                    return(response);
                },
                    () =>
                    request.Delete(string.Join("/", RequestObject.Certificate,
                                               string.Format(CultureInfo.InvariantCulture, "{0}?forceDeleteInUse=true", cert.Thumbprint)))
                );
            }
        }
        private static void DeleteUser()
        {
            using (var request = new ApiWebRequest())
            {
                Console.WriteLine("Prepare data");
                var postData = Helper.GetJsonObjectFromFile <User>(PostDataFile01);
                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("Create new User");
                    request.Post(RequestObject.Users, postData);

                    Console.WriteLine("Delete User " + postData.Name);
                    var response =
                        request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}",
                                                     RequestObject.Users, postData.Id));
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.Users,
                                                 postData.Name));
                }
                );
            }
        }
Beispiel #19
0
        // pagenation is ?page=2&per_page=100
        /// <summary>
        /// the url is like this: https://github.com/andyliuliming/WALinuxAgent.git
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public List <User> Extract(ExtractRequest extractRequest, List <string> user_logins)
        {
            GithubFeed           githubFee      = this.Parse(extractRequest.URL);
            List <User>          users          = new List <User>();
            RestApiCaller <User> userInfoCaller = new RestApiCaller <User>(ApiFormats.BaseUri);
            // 3. extract the commit info ("login")

            int leftUserLength = user_logins.Count - extractRequest.StartIndex;

            int numberToRetrieve = leftUserLength > extractRequest.Left ? extractRequest.Left : leftUserLength;

            for (int i = 0; i < numberToRetrieve; i++)
            {
                Console.WriteLine("getting the user's info: " + user_logins[extractRequest.StartIndex + i]);
                string urlParameters = string.Format(ApiFormats.UserApi, user_logins[extractRequest.StartIndex + i]);
                User   user          = null;
                Retry(
                    () =>
                {
                    user = userInfoCaller.CallApi("get", extractRequest.AccessToken, urlParameters, null);
                },
                    () =>
                {
                    extractRequest.Left--;
                }
                    );
                users.Add(user);
            }

            extractRequest.StartIndex += numberToRetrieve;

            return(users);
        }
Beispiel #20
0
 private void KeepWarm()
 {
     try
     {
         string baseUrl = AppSettingsProvider.GetSetting(FieldNameUtil.GetMemberName((AzureSettingsNames c) => c.ProductServiceAddress));
         RestApiCaller <string> warmersCaller = new RestApiCaller <string>(baseUrl);
         warmersCaller.Get("/odata/Warmers", false);
     }
     catch (Exception e)
     {
         Trace.TraceError(e.ToString());
     }
 }
 private static void PostGroup()
 {
     using (var request = new ApiWebRequest())
     {
         var postData = Helper.GetJsonObjectFromFile <Group>(GroupDataFile);
         RestApiCaller.CallAndHandleError
         (
             () =>
         {
             HttpResponseMessage message = request.Post(RequestObject.Groups, postData);
             return(message);
         },
             () => { }
         );
     }
 }
Beispiel #22
0
        public HashSet <string> ExtractUserLogin(ExtractRequest extractRequest)
        {
            GithubFeed       githubFee   = this.Parse(extractRequest.URL);
            HashSet <string> user_logins = new HashSet <string>();
            // 1. first get the branches https://api.github.com/repos/torvalds/linux
            //                              https://api.github.com/repos/apache/hadoop

            // 2. get the commits from the branches. https://api.github.com/repos/torvalds/linux/commits?page=3&per_page=100
            RestApiCaller <List <CommitDetail> > commitInfoCaller = new RestApiCaller <List <CommitDetail> >(ApiFormats.BaseUri);

            string repoBaseUri = string.Format(ApiFormats.CommitRelativePathPattern, githubFee.owner, githubFee.repo);

            while (extractRequest.Left > 0)
            {
                Console.WriteLine("getting the page: " + extractRequest.StartPage);
                string urlParameters             = repoBaseUri + "?page=" + extractRequest.StartPage + "&per_page=" + extractRequest.PerPage;
                List <CommitDetail> pagedDetails = null;
                Retry(
                    () =>
                {
                    pagedDetails = commitInfoCaller.CallApi("get", extractRequest.AccessToken, urlParameters, null);
                },
                    () =>
                {
                    extractRequest.Left--;
                }
                    );
                if (pagedDetails == null || pagedDetails.Count == 0)
                {
                    break;
                }
                else
                {
                    for (int i = 0; i < pagedDetails.Count; i++)
                    {
                        if (pagedDetails[i].author != null)
                        {
                            user_logins.Add(pagedDetails[i].author.login);
                        }
                    }
                    extractRequest.StartPage++;
                }
            }
            return(user_logins);
        }
Beispiel #23
0
        private static void PostLinkedInConnection()
        {
            using (var request = new ApiWebRequest())
            {
                var connection = Helper.GetJsonObjectFromFile <Connection>("SampleData/PostLinkedInConnectionSample.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Exercise POST LinkedIn connection");
                    return(request.Post(RequestObject.Connections, connection));
                },
                    () =>
                    request.Delete(string.Format(CultureInfo.InvariantCulture, "{0}/{1}", RequestObject.Connections,
                                                 connection.Name))
                );
            }
        }
 private static void DeleteOrganization()
 {
     using (var request = new ApiWebRequest())
     {
         var postData = Helper.GetJsonObjectFromFile <Organization>(OrganizationDataFile);
         RestApiCaller.CallAndHandleError
         (
             () =>
         {
             Console.WriteLine("Clean up organizations");
             HttpResponseMessage message =
                 request.Delete(string.Format(CultureInfo.InvariantCulture,
                                              "{0}/{1}", RequestObject.Organizations, postData.Name));
             return(message);
         },
             () => { }
         );
     }
 }
        private static void PostOrganization()
        {
            using (var request = new ApiWebRequest())
            {
                var organizationData = Helper.GetJsonObjectFromFile <Organization>("SampleData/Organization.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");

                    Console.WriteLine("-> Exercise Post");
                    var response = request.Post(RequestObject.Organizations, organizationData);
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Organizations, organizationData.Name));
                }
                );
            }
        }
Beispiel #26
0
        private static void GetCertificateNemIdConnection()
        {
            using (var request = new ApiWebRequest())
            {
                var connection = Helper.GetJsonObjectFromFile <Connection>("SampleData/NemIdConnection.json");

                RestApiCaller.CallAndHandleError
                (
                    () =>
                {
                    Console.WriteLine("-> Create data");
                    request.Post(RequestObject.Connections, connection);

                    Console.WriteLine("-> Exercise GET certificate for NemId connection");
                    var response = request.Get(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.ConnectionsCertificate, connection.Name));
                    return(response);
                },
                    () =>
                {
                    request.Delete(string.Format(CultureInfo.CurrentCulture, "{0}/{1}", RequestObject.Connections, connection.Name));
                }
                );
            }
        }