text:
# This file is auto-generated by AWSMetadata.jl
using AWS
using AWS.AWSServices: mturk
using AWS.Compat
using AWS.UUIDs

"""
    AcceptQualificationRequest()

 The AcceptQualificationRequest operation approves a Worker's request for a Qualification.   Only the owner of the Qualification type can grant a Qualification request for that type.   A successful request for the AcceptQualificationRequest operation returns with no errors and an empty body.

# Required Parameters
- `QualificationRequestId`: The ID of the Qualification request, as returned by the GetQualificationRequests operation.

# Optional Parameters
- `IntegerValue`:  The value of the Qualification. You can omit this value if you are using the presence or absence of the Qualification as the basis for a HIT requirement.
"""
accept_qualification_request(QualificationRequestId; aws_config::AWSConfig=global_aws_config()) = mturk("AcceptQualificationRequest", Dict{String, Any}("QualificationRequestId"=>QualificationRequestId); aws_config=aws_config)
accept_qualification_request(QualificationRequestId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("AcceptQualificationRequest", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationRequestId"=>QualificationRequestId), args)); aws_config=aws_config)

"""
    ApproveAssignment()

 The ApproveAssignment operation approves the results of a completed assignment.   Approving an assignment initiates two payments from the Requester's Amazon.com account     The Worker who submitted the results is paid the reward specified in the HIT.     Amazon Mechanical Turk fees are debited.     If the Requester's account does not have adequate funds for these payments, the call to ApproveAssignment returns an exception, and the approval is not processed. You can include an optional feedback message with the approval, which the Worker can see in the Status section of the web site.   You can also call this operation for assignments that were previous rejected and approve them by explicitly overriding the previous rejection. This only works on rejected assignments that were submitted within the previous 30 days and only if the assignment's related HIT has not been deleted.

# Required Parameters
- `AssignmentId`:  The ID of the assignment. The assignment must correspond to a HIT created by the Requester.

# Optional Parameters
- `OverrideRejection`:  A flag indicating that an assignment should be approved even if it was previously rejected. Defaults to False.
- `RequesterFeedback`:  A message for the Worker, which the Worker can see in the Status section of the web site.
"""
approve_assignment(AssignmentId; aws_config::AWSConfig=global_aws_config()) = mturk("ApproveAssignment", Dict{String, Any}("AssignmentId"=>AssignmentId); aws_config=aws_config)
approve_assignment(AssignmentId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ApproveAssignment", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentId"=>AssignmentId), args)); aws_config=aws_config)

"""
    AssociateQualificationWithWorker()

 The AssociateQualificationWithWorker operation gives a Worker a Qualification. AssociateQualificationWithWorker does not require that the Worker submit a Qualification request. It gives the Qualification directly to the Worker.   You can only assign a Qualification of a Qualification type that you created (using the CreateQualificationType operation).    Note: AssociateQualificationWithWorker does not affect any pending Qualification requests for the Qualification by the Worker. If you assign a Qualification to a Worker, then later grant a Qualification request made by the Worker, the granting of the request may modify the Qualification score. To resolve a pending Qualification request without affecting the Qualification the Worker already has, reject the request with the RejectQualificationRequest operation.

# Required Parameters
- `QualificationTypeId`: The ID of the Qualification type to use for the assigned Qualification.
- `WorkerId`:  The ID of the Worker to whom the Qualification is being assigned. Worker IDs are included with submitted HIT assignments and Qualification requests.

# Optional Parameters
- `IntegerValue`: The value of the Qualification to assign.
- `SendNotification`:  Specifies whether to send a notification email message to the Worker saying that the qualification was assigned to the Worker. Note: this is true by default.
"""
associate_qualification_with_worker(QualificationTypeId, WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("AssociateQualificationWithWorker", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId); aws_config=aws_config)
associate_qualification_with_worker(QualificationTypeId, WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("AssociateQualificationWithWorker", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    CreateAdditionalAssignmentsForHIT()

 The CreateAdditionalAssignmentsForHIT operation increases the maximum number of assignments of an existing HIT.   To extend the maximum number of assignments, specify the number of additional assignments.    HITs created with fewer than 10 assignments cannot be extended to have 10 or more assignments. Attempting to add assignments in a way that brings the total number of assignments for a HIT from fewer than 10 assignments to 10 or more assignments will result in an AWS.MechanicalTurk.InvalidMaximumAssignmentsIncrease exception.   HITs that were created before July 22, 2015 cannot be extended. Attempting to extend HITs that were created before July 22, 2015 will result in an AWS.MechanicalTurk.HITTooOldForExtension exception.

# Required Parameters
- `HITId`: The ID of the HIT to extend.
- `NumberOfAdditionalAssignments`: The number of additional assignments to request for this HIT.

# Optional Parameters
- `UniqueRequestToken`:  A unique identifier for this request, which allows you to retry the call on error without extending the HIT multiple times. This is useful in cases such as network timeouts where it is unclear whether or not the call succeeded on the server. If the extend HIT already exists in the system from a previous call using the same UniqueRequestToken, subsequent calls will return an error with a message containing the request ID.
"""
create_additional_assignments_for_hit(HITId, NumberOfAdditionalAssignments; aws_config::AWSConfig=global_aws_config()) = mturk("CreateAdditionalAssignmentsForHIT", Dict{String, Any}("HITId"=>HITId, "NumberOfAdditionalAssignments"=>NumberOfAdditionalAssignments); aws_config=aws_config)
create_additional_assignments_for_hit(HITId, NumberOfAdditionalAssignments, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateAdditionalAssignmentsForHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId, "NumberOfAdditionalAssignments"=>NumberOfAdditionalAssignments), args)); aws_config=aws_config)

"""
    CreateHIT()

The CreateHIT operation creates a new Human Intelligence Task (HIT). The new HIT is made available for Workers to find and accept on the Amazon Mechanical Turk website.   This operation allows you to specify a new HIT by passing in values for the properties of the HIT, such as its title, reward amount and number of assignments. When you pass these values to CreateHIT, a new HIT is created for you, with a new HITTypeID. The HITTypeID can be used to create additional HITs in the future without needing to specify common parameters such as the title, description and reward amount each time.  An alternative way to create HITs is to first generate a HITTypeID using the CreateHITType operation and then call the CreateHITWithHITType operation. This is the recommended best practice for Requesters who are creating large numbers of HITs.  CreateHIT also supports several ways to provide question data: by providing a value for the Question parameter that fully specifies the contents of the HIT, or by providing a HitLayoutId and associated HitLayoutParameters.    If a HIT is created with 10 or more maximum assignments, there is an additional fee. For more information, see Amazon Mechanical Turk Pricing.

# Required Parameters
- `AssignmentDurationInSeconds`:  The amount of time, in seconds, that a Worker has to complete the HIT after accepting it. If a Worker does not complete the assignment within the specified duration, the assignment is considered abandoned. If the HIT is still active (that is, its lifetime has not elapsed), the assignment becomes available for other users to find and accept.
- `Description`:  A general description of the HIT. A description includes detailed information about the kind of task the HIT contains. On the Amazon Mechanical Turk web site, the HIT description appears in the expanded view of search results, and in the HIT and assignment screens. A good description gives the user enough information to evaluate the HIT before accepting it.
- `LifetimeInSeconds`:  An amount of time, in seconds, after which the HIT is no longer available for users to accept. After the lifetime of the HIT elapses, the HIT no longer appears in HIT searches, even if not all of the assignments for the HIT have been accepted.
- `Reward`:  The amount of money the Requester will pay a Worker for successfully completing the HIT.
- `Title`:  The title of the HIT. A title should be short and descriptive about the kind of task the HIT contains. On the Amazon Mechanical Turk web site, the HIT title appears in search results, and everywhere the HIT is mentioned.

# Optional Parameters
- `AssignmentReviewPolicy`:  The Assignment-level Review Policy applies to the assignments under the HIT. You can specify for Mechanical Turk to take various actions based on the policy.
- `AutoApprovalDelayInSeconds`:  The number of seconds after an assignment for the HIT has been submitted, after which the assignment is considered Approved automatically unless the Requester explicitly rejects it.
- `HITLayoutId`:  The HITLayoutId allows you to use a pre-existing HIT design with placeholder values and create an additional HIT by providing those values as HITLayoutParameters.   Constraints: Either a Question parameter or a HITLayoutId parameter must be provided.
- `HITLayoutParameters`:  If the HITLayoutId is provided, any placeholder values must be filled in with values using the HITLayoutParameter structure. For more information, see HITLayout.
- `HITReviewPolicy`:  The HIT-level Review Policy applies to the HIT. You can specify for Mechanical Turk to take various actions based on the policy.
- `Keywords`:  One or more words or phrases that describe the HIT, separated by commas. These words are used in searches to find HITs.
- `MaxAssignments`:  The number of times the HIT can be accepted and completed before the HIT becomes unavailable.
- `QualificationRequirements`:  Conditions that a Worker's Qualifications must meet in order to accept the HIT. A HIT can have between zero and ten Qualification requirements. All requirements must be met in order for a Worker to accept the HIT. Additionally, other actions can be restricted using the ActionsGuarded field on each QualificationRequirement structure.
- `Question`:  The data the person completing the HIT uses to produce the results.   Constraints: Must be a QuestionForm data structure, an ExternalQuestion data structure, or an HTMLQuestion data structure. The XML question data must not be larger than 64 kilobytes (65,535 bytes) in size, including whitespace.  Either a Question parameter or a HITLayoutId parameter must be provided.
- `RequesterAnnotation`:  An arbitrary data field. The RequesterAnnotation parameter lets your application attach arbitrary data to the HIT for tracking purposes. For example, this parameter could be an identifier internal to the Requester's application that corresponds with the HIT.   The RequesterAnnotation parameter for a HIT is only visible to the Requester who created the HIT. It is not shown to the Worker, or any other Requester.   The RequesterAnnotation parameter may be different for each HIT you submit. It does not affect how your HITs are grouped.
- `UniqueRequestToken`:  A unique identifier for this request which allows you to retry the call on error without creating duplicate HITs. This is useful in cases such as network timeouts where it is unclear whether or not the call succeeded on the server. If the HIT already exists in the system from a previous call using the same UniqueRequestToken, subsequent calls will return a AWS.MechanicalTurk.HitAlreadyExists error with a message containing the HITId.    Note: It is your responsibility to ensure uniqueness of the token. The unique token expires after 24 hours. Subsequent calls using the same UniqueRequestToken made after the 24 hour limit could create duplicate HITs.
"""
create_hit(AssignmentDurationInSeconds, Description, LifetimeInSeconds, Reward, Title; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHIT", Dict{String, Any}("AssignmentDurationInSeconds"=>AssignmentDurationInSeconds, "Description"=>Description, "LifetimeInSeconds"=>LifetimeInSeconds, "Reward"=>Reward, "Title"=>Title); aws_config=aws_config)
create_hit(AssignmentDurationInSeconds, Description, LifetimeInSeconds, Reward, Title, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentDurationInSeconds"=>AssignmentDurationInSeconds, "Description"=>Description, "LifetimeInSeconds"=>LifetimeInSeconds, "Reward"=>Reward, "Title"=>Title), args)); aws_config=aws_config)

"""
    CreateHITType()

 The CreateHITType operation creates a new HIT type. This operation allows you to define a standard set of HIT properties to use when creating HITs. If you register a HIT type with values that match an existing HIT type, the HIT type ID of the existing type will be returned.

# Required Parameters
- `AssignmentDurationInSeconds`:  The amount of time, in seconds, that a Worker has to complete the HIT after accepting it. If a Worker does not complete the assignment within the specified duration, the assignment is considered abandoned. If the HIT is still active (that is, its lifetime has not elapsed), the assignment becomes available for other users to find and accept.
- `Description`:  A general description of the HIT. A description includes detailed information about the kind of task the HIT contains. On the Amazon Mechanical Turk web site, the HIT description appears in the expanded view of search results, and in the HIT and assignment screens. A good description gives the user enough information to evaluate the HIT before accepting it.
- `Reward`:  The amount of money the Requester will pay a Worker for successfully completing the HIT.
- `Title`:  The title of the HIT. A title should be short and descriptive about the kind of task the HIT contains. On the Amazon Mechanical Turk web site, the HIT title appears in search results, and everywhere the HIT is mentioned.

# Optional Parameters
- `AutoApprovalDelayInSeconds`:  The number of seconds after an assignment for the HIT has been submitted, after which the assignment is considered Approved automatically unless the Requester explicitly rejects it.
- `Keywords`:  One or more words or phrases that describe the HIT, separated by commas. These words are used in searches to find HITs.
- `QualificationRequirements`:  Conditions that a Worker's Qualifications must meet in order to accept the HIT. A HIT can have between zero and ten Qualification requirements. All requirements must be met in order for a Worker to accept the HIT. Additionally, other actions can be restricted using the ActionsGuarded field on each QualificationRequirement structure.
"""
create_hittype(AssignmentDurationInSeconds, Description, Reward, Title; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHITType", Dict{String, Any}("AssignmentDurationInSeconds"=>AssignmentDurationInSeconds, "Description"=>Description, "Reward"=>Reward, "Title"=>Title); aws_config=aws_config)
create_hittype(AssignmentDurationInSeconds, Description, Reward, Title, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHITType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentDurationInSeconds"=>AssignmentDurationInSeconds, "Description"=>Description, "Reward"=>Reward, "Title"=>Title), args)); aws_config=aws_config)

"""
    CreateHITWithHITType()

 The CreateHITWithHITType operation creates a new Human Intelligence Task (HIT) using an existing HITTypeID generated by the CreateHITType operation.   This is an alternative way to create HITs from the CreateHIT operation. This is the recommended best practice for Requesters who are creating large numbers of HITs.  CreateHITWithHITType also supports several ways to provide question data: by providing a value for the Question parameter that fully specifies the contents of the HIT, or by providing a HitLayoutId and associated HitLayoutParameters.    If a HIT is created with 10 or more maximum assignments, there is an additional fee. For more information, see Amazon Mechanical Turk Pricing.

# Required Parameters
- `HITTypeId`: The HIT type ID you want to create this HIT with.
- `LifetimeInSeconds`:  An amount of time, in seconds, after which the HIT is no longer available for users to accept. After the lifetime of the HIT elapses, the HIT no longer appears in HIT searches, even if not all of the assignments for the HIT have been accepted.

# Optional Parameters
- `AssignmentReviewPolicy`:  The Assignment-level Review Policy applies to the assignments under the HIT. You can specify for Mechanical Turk to take various actions based on the policy.
- `HITLayoutId`:  The HITLayoutId allows you to use a pre-existing HIT design with placeholder values and create an additional HIT by providing those values as HITLayoutParameters.   Constraints: Either a Question parameter or a HITLayoutId parameter must be provided.
- `HITLayoutParameters`:  If the HITLayoutId is provided, any placeholder values must be filled in with values using the HITLayoutParameter structure. For more information, see HITLayout.
- `HITReviewPolicy`:  The HIT-level Review Policy applies to the HIT. You can specify for Mechanical Turk to take various actions based on the policy.
- `MaxAssignments`:  The number of times the HIT can be accepted and completed before the HIT becomes unavailable.
- `Question`:  The data the person completing the HIT uses to produce the results.   Constraints: Must be a QuestionForm data structure, an ExternalQuestion data structure, or an HTMLQuestion data structure. The XML question data must not be larger than 64 kilobytes (65,535 bytes) in size, including whitespace.  Either a Question parameter or a HITLayoutId parameter must be provided.
- `RequesterAnnotation`:  An arbitrary data field. The RequesterAnnotation parameter lets your application attach arbitrary data to the HIT for tracking purposes. For example, this parameter could be an identifier internal to the Requester's application that corresponds with the HIT.   The RequesterAnnotation parameter for a HIT is only visible to the Requester who created the HIT. It is not shown to the Worker, or any other Requester.   The RequesterAnnotation parameter may be different for each HIT you submit. It does not affect how your HITs are grouped.
- `UniqueRequestToken`:  A unique identifier for this request which allows you to retry the call on error without creating duplicate HITs. This is useful in cases such as network timeouts where it is unclear whether or not the call succeeded on the server. If the HIT already exists in the system from a previous call using the same UniqueRequestToken, subsequent calls will return a AWS.MechanicalTurk.HitAlreadyExists error with a message containing the HITId.    Note: It is your responsibility to ensure uniqueness of the token. The unique token expires after 24 hours. Subsequent calls using the same UniqueRequestToken made after the 24 hour limit could create duplicate HITs.
"""
create_hitwith_hittype(HITTypeId, LifetimeInSeconds; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHITWithHITType", Dict{String, Any}("HITTypeId"=>HITTypeId, "LifetimeInSeconds"=>LifetimeInSeconds); aws_config=aws_config)
create_hitwith_hittype(HITTypeId, LifetimeInSeconds, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateHITWithHITType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITTypeId"=>HITTypeId, "LifetimeInSeconds"=>LifetimeInSeconds), args)); aws_config=aws_config)

"""
    CreateQualificationType()

 The CreateQualificationType operation creates a new Qualification type, which is represented by a QualificationType data structure.

# Required Parameters
- `Description`: A long description for the Qualification type. On the Amazon Mechanical Turk website, the long description is displayed when a Worker examines a Qualification type.
- `Name`:  The name you give to the Qualification type. The type name is used to represent the Qualification to Workers, and to find the type using a Qualification type search. It must be unique across all of your Qualification types.
- `QualificationTypeStatus`: The initial status of the Qualification type. Constraints: Valid values are: Active | Inactive

# Optional Parameters
- `AnswerKey`: The answers to the Qualification test specified in the Test parameter, in the form of an AnswerKey data structure. Constraints: Must not be longer than 65535 bytes. Constraints: None. If not specified, you must process Qualification requests manually.
- `AutoGranted`: Specifies whether requests for the Qualification type are granted immediately, without prompting the Worker with a Qualification test. Constraints: If the Test parameter is specified, this parameter cannot be true.
- `AutoGrantedValue`: The Qualification value to use for automatically granted Qualifications. This parameter is used only if the AutoGranted parameter is true.
- `Keywords`: One or more words or phrases that describe the Qualification type, separated by commas. The keywords of a type make the type easier to find during a search.
- `RetryDelayInSeconds`: The number of seconds that a Worker must wait after requesting a Qualification of the Qualification type before the worker can retry the Qualification request. Constraints: None. If not specified, retries are disabled and Workers can request a Qualification of this type only once, even if the Worker has not been granted the Qualification. It is not possible to disable retries for a Qualification type after it has been created with retries enabled. If you want to disable retries, you must delete existing retry-enabled Qualification type and then create a new Qualification type with retries disabled.
- `Test`:  The questions for the Qualification test a Worker must answer correctly to obtain a Qualification of this type. If this parameter is specified, TestDurationInSeconds must also be specified.  Constraints: Must not be longer than 65535 bytes. Must be a QuestionForm data structure. This parameter cannot be specified if AutoGranted is true. Constraints: None. If not specified, the Worker may request the Qualification without answering any questions.
- `TestDurationInSeconds`: The number of seconds the Worker has to complete the Qualification test, starting from the time the Worker requests the Qualification.
"""
create_qualification_type(Description, Name, QualificationTypeStatus; aws_config::AWSConfig=global_aws_config()) = mturk("CreateQualificationType", Dict{String, Any}("Description"=>Description, "Name"=>Name, "QualificationTypeStatus"=>QualificationTypeStatus); aws_config=aws_config)
create_qualification_type(Description, Name, QualificationTypeStatus, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("Description"=>Description, "Name"=>Name, "QualificationTypeStatus"=>QualificationTypeStatus), args)); aws_config=aws_config)

"""
    CreateWorkerBlock()

The CreateWorkerBlock operation allows you to prevent a Worker from working on your HITs. For example, you can block a Worker who is producing poor quality work. You can block up to 100,000 Workers.

# Required Parameters
- `Reason`: A message explaining the reason for blocking the Worker. This parameter enables you to keep track of your Workers. The Worker does not see this message.
- `WorkerId`: The ID of the Worker to block.

"""
create_worker_block(Reason, WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("CreateWorkerBlock", Dict{String, Any}("Reason"=>Reason, "WorkerId"=>WorkerId); aws_config=aws_config)
create_worker_block(Reason, WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("CreateWorkerBlock", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("Reason"=>Reason, "WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    DeleteHIT()

 The DeleteHIT operation is used to delete HIT that is no longer needed. Only the Requester who created the HIT can delete it.   You can only dispose of HITs that are in the Reviewable state, with all of their submitted assignments already either approved or rejected. If you call the DeleteHIT operation on a HIT that is not in the Reviewable state (for example, that has not expired, or still has active assignments), or on a HIT that is Reviewable but without all of its submitted assignments already approved or rejected, the service will return an error.      HITs are automatically disposed of after 120 days.     After you dispose of a HIT, you can no longer approve the HIT's rejected assignments.     Disposed HITs are not returned in results for the ListHITs operation.     Disposing HITs can improve the performance of operations such as ListReviewableHITs and ListHITs.

# Required Parameters
- `HITId`: The ID of the HIT to be deleted.

"""
delete_hit(HITId; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteHIT", Dict{String, Any}("HITId"=>HITId); aws_config=aws_config)
delete_hit(HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId), args)); aws_config=aws_config)

"""
    DeleteQualificationType()

 The DeleteQualificationType deletes a Qualification type and deletes any HIT types that are associated with the Qualification type.  This operation does not revoke Qualifications already assigned to Workers because the Qualifications might be needed for active HITs. If there are any pending requests for the Qualification type, Amazon Mechanical Turk rejects those requests. After you delete a Qualification type, you can no longer use it to create HITs or HIT types.  DeleteQualificationType must wait for all the HITs that use the deleted Qualification type to be deleted before completing. It may take up to 48 hours before DeleteQualificationType completes and the unique name of the Qualification type is available for reuse with CreateQualificationType.

# Required Parameters
- `QualificationTypeId`: The ID of the QualificationType to dispose.

"""
delete_qualification_type(QualificationTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteQualificationType", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId); aws_config=aws_config)
delete_qualification_type(QualificationTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId), args)); aws_config=aws_config)

"""
    DeleteWorkerBlock()

The DeleteWorkerBlock operation allows you to reinstate a blocked Worker to work on your HITs. This operation reverses the effects of the CreateWorkerBlock operation. You need the Worker ID to use this operation. If the Worker ID is missing or invalid, this operation fails and returns the message “WorkerId is invalid.” If the specified Worker is not blocked, this operation returns successfully.

# Required Parameters
- `WorkerId`: The ID of the Worker to unblock.

# Optional Parameters
- `Reason`: A message that explains the reason for unblocking the Worker. The Worker does not see this message.
"""
delete_worker_block(WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteWorkerBlock", Dict{String, Any}("WorkerId"=>WorkerId); aws_config=aws_config)
delete_worker_block(WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("DeleteWorkerBlock", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    DisassociateQualificationFromWorker()

 The DisassociateQualificationFromWorker revokes a previously granted Qualification from a user.   You can provide a text message explaining why the Qualification was revoked. The user who had the Qualification can see this message.

# Required Parameters
- `QualificationTypeId`: The ID of the Qualification type of the Qualification to be revoked.
- `WorkerId`: The ID of the Worker who possesses the Qualification to be revoked.

# Optional Parameters
- `Reason`: A text message that explains why the Qualification was revoked. The user who had the Qualification sees this message.
"""
disassociate_qualification_from_worker(QualificationTypeId, WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("DisassociateQualificationFromWorker", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId); aws_config=aws_config)
disassociate_qualification_from_worker(QualificationTypeId, WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("DisassociateQualificationFromWorker", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    GetAccountBalance()

The GetAccountBalance operation retrieves the amount of money in your Amazon Mechanical Turk account.

"""
get_account_balance(; aws_config::AWSConfig=global_aws_config()) = mturk("GetAccountBalance"; aws_config=aws_config)
get_account_balance(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetAccountBalance", args; aws_config=aws_config)

"""
    GetAssignment()

 The GetAssignment operation retrieves the details of the specified Assignment.

# Required Parameters
- `AssignmentId`: The ID of the Assignment to be retrieved.

"""
get_assignment(AssignmentId; aws_config::AWSConfig=global_aws_config()) = mturk("GetAssignment", Dict{String, Any}("AssignmentId"=>AssignmentId); aws_config=aws_config)
get_assignment(AssignmentId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetAssignment", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentId"=>AssignmentId), args)); aws_config=aws_config)

"""
    GetFileUploadURL()

 The GetFileUploadURL operation generates and returns a temporary URL. You use the temporary URL to retrieve a file uploaded by a Worker as an answer to a FileUploadAnswer question for a HIT. The temporary URL is generated the instant the GetFileUploadURL operation is called, and is valid for 60 seconds. You can get a temporary file upload URL any time until the HIT is disposed. After the HIT is disposed, any uploaded files are deleted, and cannot be retrieved. Pending Deprecation on December 12, 2017. The Answer Specification structure will no longer support the FileUploadAnswer element to be used for the QuestionForm data structure. Instead, we recommend that Requesters who want to create HITs asking Workers to upload files to use Amazon S3.

# Required Parameters
- `AssignmentId`: The ID of the assignment that contains the question with a FileUploadAnswer.
- `QuestionIdentifier`: The identifier of the question with a FileUploadAnswer, as specified in the QuestionForm of the HIT.

"""
get_file_upload_url(AssignmentId, QuestionIdentifier; aws_config::AWSConfig=global_aws_config()) = mturk("GetFileUploadURL", Dict{String, Any}("AssignmentId"=>AssignmentId, "QuestionIdentifier"=>QuestionIdentifier); aws_config=aws_config)
get_file_upload_url(AssignmentId, QuestionIdentifier, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetFileUploadURL", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentId"=>AssignmentId, "QuestionIdentifier"=>QuestionIdentifier), args)); aws_config=aws_config)

"""
    GetHIT()

 The GetHIT operation retrieves the details of the specified HIT.

# Required Parameters
- `HITId`: The ID of the HIT to be retrieved.

"""
get_hit(HITId; aws_config::AWSConfig=global_aws_config()) = mturk("GetHIT", Dict{String, Any}("HITId"=>HITId); aws_config=aws_config)
get_hit(HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId), args)); aws_config=aws_config)

"""
    GetQualificationScore()

 The GetQualificationScore operation returns the value of a Worker's Qualification for a given Qualification type.   To get a Worker's Qualification, you must know the Worker's ID. The Worker's ID is included in the assignment data returned by the ListAssignmentsForHIT operation.  Only the owner of a Qualification type can query the value of a Worker's Qualification of that type.

# Required Parameters
- `QualificationTypeId`: The ID of the QualificationType.
- `WorkerId`: The ID of the Worker whose Qualification is being updated.

"""
get_qualification_score(QualificationTypeId, WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("GetQualificationScore", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId); aws_config=aws_config)
get_qualification_score(QualificationTypeId, WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetQualificationScore", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId, "WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    GetQualificationType()

 The GetQualificationTypeoperation retrieves information about a Qualification type using its ID.

# Required Parameters
- `QualificationTypeId`: The ID of the QualificationType.

"""
get_qualification_type(QualificationTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("GetQualificationType", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId); aws_config=aws_config)
get_qualification_type(QualificationTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("GetQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId), args)); aws_config=aws_config)

"""
    ListAssignmentsForHIT()

 The ListAssignmentsForHIT operation retrieves completed assignments for a HIT. You can use this operation to retrieve the results for a HIT.   You can get assignments for a HIT at any time, even if the HIT is not yet Reviewable. If a HIT requested multiple assignments, and has received some results but has not yet become Reviewable, you can still retrieve the partial results with this operation.   Use the AssignmentStatus parameter to control which set of assignments for a HIT are returned. The ListAssignmentsForHIT operation can return submitted assignments awaiting approval, or it can return assignments that have already been approved or rejected. You can set AssignmentStatus=Approved,Rejected to get assignments that have already been approved and rejected together in one result set.   Only the Requester who created the HIT can retrieve the assignments for that HIT.   Results are sorted and divided into numbered pages and the operation returns a single page of results. You can use the parameters of the operation to control sorting and pagination.

# Required Parameters
- `HITId`: The ID of the HIT.

# Optional Parameters
- `AssignmentStatuses`: The status of the assignments to return: Submitted | Approved | Rejected
- `MaxResults`:
- `NextToken`: Pagination token
"""
list_assignments_for_hit(HITId; aws_config::AWSConfig=global_aws_config()) = mturk("ListAssignmentsForHIT", Dict{String, Any}("HITId"=>HITId); aws_config=aws_config)
list_assignments_for_hit(HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListAssignmentsForHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId), args)); aws_config=aws_config)

"""
    ListBonusPayments()

 The ListBonusPayments operation retrieves the amounts of bonuses you have paid to Workers for a given HIT or assignment.

# Optional Parameters
- `AssignmentId`: The ID of the assignment associated with the bonus payments to retrieve. If specified, only bonus payments for the given assignment are returned. Either the HITId parameter or the AssignmentId parameter must be specified
- `HITId`: The ID of the HIT associated with the bonus payments to retrieve. If not specified, all bonus payments for all assignments for the given HIT are returned. Either the HITId parameter or the AssignmentId parameter must be specified
- `MaxResults`:
- `NextToken`: Pagination token
"""
list_bonus_payments(; aws_config::AWSConfig=global_aws_config()) = mturk("ListBonusPayments"; aws_config=aws_config)
list_bonus_payments(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListBonusPayments", args; aws_config=aws_config)

"""
    ListHITs()

 The ListHITs operation returns all of a Requester's HITs. The operation returns HITs of any status, except for HITs that have been deleted of with the DeleteHIT operation or that have been auto-deleted.

# Optional Parameters
- `MaxResults`:
- `NextToken`: Pagination token
"""
list_hits(; aws_config::AWSConfig=global_aws_config()) = mturk("ListHITs"; aws_config=aws_config)
list_hits(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListHITs", args; aws_config=aws_config)

"""
    ListHITsForQualificationType()

 The ListHITsForQualificationType operation returns the HITs that use the given Qualification type for a Qualification requirement. The operation returns HITs of any status, except for HITs that have been deleted with the DeleteHIT operation or that have been auto-deleted.

# Required Parameters
- `QualificationTypeId`:  The ID of the Qualification type to use when querying HITs.

# Optional Parameters
- `MaxResults`:  Limit the number of results returned.
- `NextToken`: Pagination Token
"""
list_hits_for_qualification_type(QualificationTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("ListHITsForQualificationType", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId); aws_config=aws_config)
list_hits_for_qualification_type(QualificationTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListHITsForQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId), args)); aws_config=aws_config)

"""
    ListQualificationRequests()

 The ListQualificationRequests operation retrieves requests for Qualifications of a particular Qualification type. The owner of the Qualification type calls this operation to poll for pending requests, and accepts them using the AcceptQualification operation.

# Optional Parameters
- `MaxResults`:  The maximum number of results to return in a single call.
- `NextToken`:
- `QualificationTypeId`: The ID of the QualificationType.
"""
list_qualification_requests(; aws_config::AWSConfig=global_aws_config()) = mturk("ListQualificationRequests"; aws_config=aws_config)
list_qualification_requests(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListQualificationRequests", args; aws_config=aws_config)

"""
    ListQualificationTypes()

 The ListQualificationTypes operation returns a list of Qualification types, filtered by an optional search term.

# Required Parameters
- `MustBeRequestable`: Specifies that only Qualification types that a user can request through the Amazon Mechanical Turk web site, such as by taking a Qualification test, are returned as results of the search. Some Qualification types, such as those assigned automatically by the system, cannot be requested directly by users. If false, all Qualification types, including those managed by the system, are considered. Valid values are True | False.

# Optional Parameters
- `MaxResults`:  The maximum number of results to return in a single call.
- `MustBeOwnedByCaller`:  Specifies that only Qualification types that the Requester created are returned. If false, the operation returns all Qualification types.
- `NextToken`:
- `Query`:  A text query against all of the searchable attributes of Qualification types.
"""
list_qualification_types(MustBeRequestable; aws_config::AWSConfig=global_aws_config()) = mturk("ListQualificationTypes", Dict{String, Any}("MustBeRequestable"=>MustBeRequestable); aws_config=aws_config)
list_qualification_types(MustBeRequestable, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListQualificationTypes", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("MustBeRequestable"=>MustBeRequestable), args)); aws_config=aws_config)

"""
    ListReviewPolicyResultsForHIT()

 The ListReviewPolicyResultsForHIT operation retrieves the computed results and the actions taken in the course of executing your Review Policies for a given HIT. For information about how to specify Review Policies when you call CreateHIT, see Review Policies. The ListReviewPolicyResultsForHIT operation can return results for both Assignment-level and HIT-level review results.

# Required Parameters
- `HITId`: The unique identifier of the HIT to retrieve review results for.

# Optional Parameters
- `MaxResults`: Limit the number of results returned.
- `NextToken`: Pagination token
- `PolicyLevels`:  The Policy Level(s) to retrieve review results for - HIT or Assignment. If omitted, the default behavior is to retrieve all data for both policy levels. For a list of all the described policies, see Review Policies.
- `RetrieveActions`:  Specify if the operation should retrieve a list of the actions taken executing the Review Policies and their outcomes.
- `RetrieveResults`:  Specify if the operation should retrieve a list of the results computed by the Review Policies.
"""
list_review_policy_results_for_hit(HITId; aws_config::AWSConfig=global_aws_config()) = mturk("ListReviewPolicyResultsForHIT", Dict{String, Any}("HITId"=>HITId); aws_config=aws_config)
list_review_policy_results_for_hit(HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListReviewPolicyResultsForHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId), args)); aws_config=aws_config)

"""
    ListReviewableHITs()

 The ListReviewableHITs operation retrieves the HITs with Status equal to Reviewable or Status equal to Reviewing that belong to the Requester calling the operation.

# Optional Parameters
- `HITTypeId`:  The ID of the HIT type of the HITs to consider for the query. If not specified, all HITs for the Reviewer are considered
- `MaxResults`:  Limit the number of results returned.
- `NextToken`: Pagination Token
- `Status`:  Can be either Reviewable or Reviewing. Reviewable is the default value.
"""
list_reviewable_hits(; aws_config::AWSConfig=global_aws_config()) = mturk("ListReviewableHITs"; aws_config=aws_config)
list_reviewable_hits(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListReviewableHITs", args; aws_config=aws_config)

"""
    ListWorkerBlocks()

The ListWorkersBlocks operation retrieves a list of Workers who are blocked from working on your HITs.

# Optional Parameters
- `MaxResults`:
- `NextToken`: Pagination token
"""
list_worker_blocks(; aws_config::AWSConfig=global_aws_config()) = mturk("ListWorkerBlocks"; aws_config=aws_config)
list_worker_blocks(args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListWorkerBlocks", args; aws_config=aws_config)

"""
    ListWorkersWithQualificationType()

 The ListWorkersWithQualificationType operation returns all of the Workers that have been associated with a given Qualification type.

# Required Parameters
- `QualificationTypeId`: The ID of the Qualification type of the Qualifications to return.

# Optional Parameters
- `MaxResults`:  Limit the number of results returned.
- `NextToken`: Pagination Token
- `Status`:  The status of the Qualifications to return. Can be Granted | Revoked.
"""
list_workers_with_qualification_type(QualificationTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("ListWorkersWithQualificationType", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId); aws_config=aws_config)
list_workers_with_qualification_type(QualificationTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("ListWorkersWithQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId), args)); aws_config=aws_config)

"""
    NotifyWorkers()

 The NotifyWorkers operation sends an email to one or more Workers that you specify with the Worker ID. You can specify up to 100 Worker IDs to send the same message with a single call to the NotifyWorkers operation. The NotifyWorkers operation will send a notification email to a Worker only if you have previously approved or rejected work from the Worker.

# Required Parameters
- `MessageText`: The text of the email message to send. Can include up to 4,096 characters
- `Subject`: The subject line of the email message to send. Can include up to 200 characters.
- `WorkerIds`: A list of Worker IDs you wish to notify. You can notify upto 100 Workers at a time.

"""
notify_workers(MessageText, Subject, WorkerIds; aws_config::AWSConfig=global_aws_config()) = mturk("NotifyWorkers", Dict{String, Any}("MessageText"=>MessageText, "Subject"=>Subject, "WorkerIds"=>WorkerIds); aws_config=aws_config)
notify_workers(MessageText, Subject, WorkerIds, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("NotifyWorkers", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("MessageText"=>MessageText, "Subject"=>Subject, "WorkerIds"=>WorkerIds), args)); aws_config=aws_config)

"""
    RejectAssignment()

 The RejectAssignment operation rejects the results of a completed assignment.   You can include an optional feedback message with the rejection, which the Worker can see in the Status section of the web site. When you include a feedback message with the rejection, it helps the Worker understand why the assignment was rejected, and can improve the quality of the results the Worker submits in the future.   Only the Requester who created the HIT can reject an assignment for the HIT.

# Required Parameters
- `AssignmentId`:  The ID of the assignment. The assignment must correspond to a HIT created by the Requester.
- `RequesterFeedback`:  A message for the Worker, which the Worker can see in the Status section of the web site.

"""
reject_assignment(AssignmentId, RequesterFeedback; aws_config::AWSConfig=global_aws_config()) = mturk("RejectAssignment", Dict{String, Any}("AssignmentId"=>AssignmentId, "RequesterFeedback"=>RequesterFeedback); aws_config=aws_config)
reject_assignment(AssignmentId, RequesterFeedback, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("RejectAssignment", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentId"=>AssignmentId, "RequesterFeedback"=>RequesterFeedback), args)); aws_config=aws_config)

"""
    RejectQualificationRequest()

 The RejectQualificationRequest operation rejects a user's request for a Qualification.   You can provide a text message explaining why the request was rejected. The Worker who made the request can see this message.

# Required Parameters
- `QualificationRequestId`:  The ID of the Qualification request, as returned by the ListQualificationRequests operation.

# Optional Parameters
- `Reason`: A text message explaining why the request was rejected, to be shown to the Worker who made the request.
"""
reject_qualification_request(QualificationRequestId; aws_config::AWSConfig=global_aws_config()) = mturk("RejectQualificationRequest", Dict{String, Any}("QualificationRequestId"=>QualificationRequestId); aws_config=aws_config)
reject_qualification_request(QualificationRequestId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("RejectQualificationRequest", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationRequestId"=>QualificationRequestId), args)); aws_config=aws_config)

"""
    SendBonus()

 The SendBonus operation issues a payment of money from your account to a Worker. This payment happens separately from the reward you pay to the Worker when you approve the Worker's assignment. The SendBonus operation requires the Worker's ID and the assignment ID as parameters to initiate payment of the bonus. You must include a message that explains the reason for the bonus payment, as the Worker may not be expecting the payment. Amazon Mechanical Turk collects a fee for bonus payments, similar to the HIT listing fee. This operation fails if your account does not have enough funds to pay for both the bonus and the fees.

# Required Parameters
- `AssignmentId`: The ID of the assignment for which this bonus is paid.
- `BonusAmount`:  The Bonus amount is a US Dollar amount specified using a string (for example, \"5\" represents 5.00 USD and \"101.42\" represents 101.42 USD). Do not include currency symbols or currency codes.
- `Reason`: A message that explains the reason for the bonus payment. The Worker receiving the bonus can see this message.
- `WorkerId`: The ID of the Worker being paid the bonus.

# Optional Parameters
- `UniqueRequestToken`: A unique identifier for this request, which allows you to retry the call on error without granting multiple bonuses. This is useful in cases such as network timeouts where it is unclear whether or not the call succeeded on the server. If the bonus already exists in the system from a previous call using the same UniqueRequestToken, subsequent calls will return an error with a message containing the request ID.
"""
send_bonus(AssignmentId, BonusAmount, Reason, WorkerId; aws_config::AWSConfig=global_aws_config()) = mturk("SendBonus", Dict{String, Any}("AssignmentId"=>AssignmentId, "BonusAmount"=>BonusAmount, "Reason"=>Reason, "WorkerId"=>WorkerId); aws_config=aws_config)
send_bonus(AssignmentId, BonusAmount, Reason, WorkerId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("SendBonus", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("AssignmentId"=>AssignmentId, "BonusAmount"=>BonusAmount, "Reason"=>Reason, "WorkerId"=>WorkerId), args)); aws_config=aws_config)

"""
    SendTestEventNotification()

 The SendTestEventNotification operation causes Amazon Mechanical Turk to send a notification message as if a HIT event occurred, according to the provided notification specification. This allows you to test notifications without setting up notifications for a real HIT type and trying to trigger them using the website. When you call this operation, the service attempts to send the test notification immediately.

# Required Parameters
- `Notification`:  The notification specification to test. This value is identical to the value you would provide to the UpdateNotificationSettings operation when you establish the notification specification for a HIT type.
- `TestEventType`:  The event to simulate to test the notification specification. This event is included in the test message even if the notification specification does not include the event type. The notification specification does not filter out the test event.

"""
send_test_event_notification(Notification, TestEventType; aws_config::AWSConfig=global_aws_config()) = mturk("SendTestEventNotification", Dict{String, Any}("Notification"=>Notification, "TestEventType"=>TestEventType); aws_config=aws_config)
send_test_event_notification(Notification, TestEventType, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("SendTestEventNotification", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("Notification"=>Notification, "TestEventType"=>TestEventType), args)); aws_config=aws_config)

"""
    UpdateExpirationForHIT()

 The UpdateExpirationForHIT operation allows you update the expiration time of a HIT. If you update it to a time in the past, the HIT will be immediately expired.

# Required Parameters
- `ExpireAt`:  The date and time at which you want the HIT to expire
- `HITId`:  The HIT to update.

"""
update_expiration_for_hit(ExpireAt, HITId; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateExpirationForHIT", Dict{String, Any}("ExpireAt"=>ExpireAt, "HITId"=>HITId); aws_config=aws_config)
update_expiration_for_hit(ExpireAt, HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateExpirationForHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("ExpireAt"=>ExpireAt, "HITId"=>HITId), args)); aws_config=aws_config)

"""
    UpdateHITReviewStatus()

 The UpdateHITReviewStatus operation updates the status of a HIT. If the status is Reviewable, this operation can update the status to Reviewing, or it can revert a Reviewing HIT back to the Reviewable status.

# Required Parameters
- `HITId`:  The ID of the HIT to update.

# Optional Parameters
- `Revert`:  Specifies how to update the HIT status. Default is False.     Setting this to false will only transition a HIT from Reviewable to Reviewing     Setting this to true will only transition a HIT from Reviewing to Reviewable
"""
update_hitreview_status(HITId; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateHITReviewStatus", Dict{String, Any}("HITId"=>HITId); aws_config=aws_config)
update_hitreview_status(HITId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateHITReviewStatus", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId), args)); aws_config=aws_config)

"""
    UpdateHITTypeOfHIT()

 The UpdateHITTypeOfHIT operation allows you to change the HITType properties of a HIT. This operation disassociates the HIT from its old HITType properties and associates it with the new HITType properties. The HIT takes on the properties of the new HITType in place of the old ones.

# Required Parameters
- `HITId`: The HIT to update.
- `HITTypeId`: The ID of the new HIT type.

"""
update_hittype_of_hit(HITId, HITTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateHITTypeOfHIT", Dict{String, Any}("HITId"=>HITId, "HITTypeId"=>HITTypeId); aws_config=aws_config)
update_hittype_of_hit(HITId, HITTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateHITTypeOfHIT", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITId"=>HITId, "HITTypeId"=>HITTypeId), args)); aws_config=aws_config)

"""
    UpdateNotificationSettings()

 The UpdateNotificationSettings operation creates, updates, disables or re-enables notifications for a HIT type. If you call the UpdateNotificationSettings operation for a HIT type that already has a notification specification, the operation replaces the old specification with a new one. You can call the UpdateNotificationSettings operation to enable or disable notifications for the HIT type, without having to modify the notification specification itself by providing updates to the Active status without specifying a new notification specification. To change the Active status of a HIT type's notifications, the HIT type must already have a notification specification, or one must be provided in the same call to UpdateNotificationSettings.

# Required Parameters
- `HITTypeId`:  The ID of the HIT type whose notification specification is being updated.

# Optional Parameters
- `Active`:  Specifies whether notifications are sent for HITs of this HIT type, according to the notification specification. You must specify either the Notification parameter or the Active parameter for the call to UpdateNotificationSettings to succeed.
- `Notification`:  The notification specification for the HIT type.
"""
update_notification_settings(HITTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateNotificationSettings", Dict{String, Any}("HITTypeId"=>HITTypeId); aws_config=aws_config)
update_notification_settings(HITTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateNotificationSettings", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("HITTypeId"=>HITTypeId), args)); aws_config=aws_config)

"""
    UpdateQualificationType()

 The UpdateQualificationType operation modifies the attributes of an existing Qualification type, which is represented by a QualificationType data structure. Only the owner of a Qualification type can modify its attributes.   Most attributes of a Qualification type can be changed after the type has been created. However, the Name and Keywords fields cannot be modified. The RetryDelayInSeconds parameter can be modified or added to change the delay or to enable retries, but RetryDelayInSeconds cannot be used to disable retries.   You can use this operation to update the test for a Qualification type. The test is updated based on the values specified for the Test, TestDurationInSeconds and AnswerKey parameters. All three parameters specify the updated test. If you are updating the test for a type, you must specify the Test and TestDurationInSeconds parameters. The AnswerKey parameter is optional; omitting it specifies that the updated test does not have an answer key.   If you omit the Test parameter, the test for the Qualification type is unchanged. There is no way to remove a test from a Qualification type that has one. If the type already has a test, you cannot update it to be AutoGranted. If the Qualification type does not have a test and one is provided by an update, the type will henceforth have a test.   If you want to update the test duration or answer key for an existing test without changing the questions, you must specify a Test parameter with the original questions, along with the updated values.   If you provide an updated Test but no AnswerKey, the new test will not have an answer key. Requests for such Qualifications must be granted manually.   You can also update the AutoGranted and AutoGrantedValue attributes of the Qualification type.

# Required Parameters
- `QualificationTypeId`: The ID of the Qualification type to update.

# Optional Parameters
- `AnswerKey`: The answers to the Qualification test specified in the Test parameter, in the form of an AnswerKey data structure.
- `AutoGranted`: Specifies whether requests for the Qualification type are granted immediately, without prompting the Worker with a Qualification test. Constraints: If the Test parameter is specified, this parameter cannot be true.
- `AutoGrantedValue`: The Qualification value to use for automatically granted Qualifications. This parameter is used only if the AutoGranted parameter is true.
- `Description`: The new description of the Qualification type.
- `QualificationTypeStatus`: The new status of the Qualification type - Active | Inactive
- `RetryDelayInSeconds`: The amount of time, in seconds, that Workers must wait after requesting a Qualification of the specified Qualification type before they can retry the Qualification request. It is not possible to disable retries for a Qualification type after it has been created with retries enabled. If you want to disable retries, you must dispose of the existing retry-enabled Qualification type using DisposeQualificationType and then create a new Qualification type with retries disabled using CreateQualificationType.
- `Test`: The questions for the Qualification test a Worker must answer correctly to obtain a Qualification of this type. If this parameter is specified, TestDurationInSeconds must also be specified. Constraints: Must not be longer than 65535 bytes. Must be a QuestionForm data structure. This parameter cannot be specified if AutoGranted is true. Constraints: None. If not specified, the Worker may request the Qualification without answering any questions.
- `TestDurationInSeconds`: The number of seconds the Worker has to complete the Qualification test, starting from the time the Worker requests the Qualification.
"""
update_qualification_type(QualificationTypeId; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateQualificationType", Dict{String, Any}("QualificationTypeId"=>QualificationTypeId); aws_config=aws_config)
update_qualification_type(QualificationTypeId, args::AbstractDict{String, <:Any}; aws_config::AWSConfig=global_aws_config()) = mturk("UpdateQualificationType", Dict{String, Any}(mergewith(_merge, Dict{String, Any}("QualificationTypeId"=>QualificationTypeId), args)); aws_config=aws_config)


text:
#=
    The file for keeping track of intermediate results.
    It mirrors some f4 functions to collect statistics
    while computing the basis.
=#

#------------------------------------------------------------------------------

# Contains information about one iteration
mutable struct IterInfo
    basissize::Int
    pairsetsize::Int
    pairsselected::Int
    matrixsize::Tuple{Int, Int}
    matrixdensity::Float64
    newpivots::Int
end

# Contains information about input generators
struct BasisInfo
    ngens::Int
    maxtotaldeg::Int

    function BasisInfo()
        new(0, 0)
    end
    function BasisInfo(ngens::Int, maxtotaldeg::Int)
        new(ngens, maxtotaldeg)
    end
end

# Stores all collected statistics for one groebner computation
mutable struct Statistics
    inputs::BasisInfo
    output::BasisInfo

    data::Vector{IterInfo}

    function Statistics()
        new(BasisInfo(), BasisInfo(), Vector{IterInfo}())
    end
end

#------------------------------------------------------------------------------

function collect_stats(basis::Basis)
    ngens  = basis.ntotal
    # maxdeg = max(last.(basis.exponents))
    maxdeg = 0
    BasisInfo(ngens, maxdeg)
end

#------------------------------------------------------------------------------

function groebner(
            polys::Vector{MPoly{GFElem{Int}}},
            stats::Statistics;
            rng::Rng=Random.MersenneTwister(42)
            ) where {Rng<:Random.AbstractRNG}

    length(polys) > 0 || error("Empty input")
    R = parent(first(polys))
    ordering(R) in (:degrevlex, ) || error("Only :degrevlex is supported")

    ring, exps, coeffs = convert_to_internal(polys)

    gb, ht = f4(ring, exps, coeffs, rng, stats)

    export_basis(parent(first(polys)), gb, ht)
end

function f4(ring::PolyRing,
            exponents::Vector{Vector{Vector{UInt16}}},
            coeffs::Vector{Vector{UInt64}},
            rng::Rng,
            stats::Statistics;
            reduced::Bool=true,
            tablesize::Int=2^16
            ) where {Rng<:Random.AbstractRNG}

    gb, ht = f4(ring, exponents, coeffs, rng; reduced=reduced, tablesize=tablesize)

    stats.output = collect_stats(gb)

    gb, ht
end

function initialize_structures(
            ring::PolyRing,
            exponents::Vector{Vector{Vector{UInt16}}},
            coeffs::Vector{Vector{UInt64}},
            rng::Random.AbstractRNG,
            tablesize::Int,
            stats::Statistics)

    basis, ht = initialize_structures(ring, exponents, coeffs, rng, tablesize)

    stats.inputs = collect_stats(basis)

    basis, ht
end

ext: jl


text:
export qerror, qerror_pq, qerror_opq

# === Functions that compute quantization error ===

"Reconstruct an encoding"
function reconstruct(
  B::Matrix{T1},
  C::Vector{Matrix{T2}}) where {T1<:Integer, T2<:AbstractFloat}

  m, n = size( B )
  d, _ = size( C[1] )
  CB   = zeros( T2, d, n )

  @inbounds for i = 1:m
    mcb = C[i] # Pick the mth codebook
    for j = 1:n
      codej = B[i, j] # Choose the code
      @simd for k = 1:d     # And copy it all
        CB[k, j] += mcb[k, codej]
      end
    end
  end

  return CB
end

function reconstruct(
  B::Vector{T1},
  C::Matrix{T2}) where {T1<:Integer, T2<:AbstractFloat}

  CB = C[:,B[:]]
  return CB
end

"Compute cost of encoding in each vector"
function veccost(
  X::Matrix{T1},
  B::Matrix{T2},
  C::Vector{Matrix{T1}}) where {T1 <: AbstractFloat, T2 <: Integer}

  # This implementation is devectorized and minimizes extra memory allocated

  d, n = size( X )
  m,_ = size(B)

  cost = zeros(T1, n)
  CB   = zeros(T1, d)

  @inbounds for i = 1:n # Loop over vectors in X
    for k = 1:m # Loop over codebooks
      Ci = C[k]
      code = B[k, i] # Choose the code
      @simd for j = 1:d # add the codebook entry
        CB[j] += Ci[j, code]
      end
    end

    # Compute the squared error
    @simd for j = 1:d
      cost[i] += (CB[j] - X[j,i]).^2
      CB[j] = 0.0
    end
  end

  cost
end

"Get the total cost of encoding"
function qerror(
  X::Matrix{T1},
  B::Matrix{T2},
  C::Vector{Matrix{T1}}) where {T1 <: AbstractFloat, T2 <: Integer}
  mean(veccost(X,B,C))
end

"Get the total error of an OPQ encoding"
function qerror_opq(
  X::Matrix{T1},
  B::Matrix{T2},
  C::Vector{Matrix{T1}},
  R::Matrix{T1}) where {T1 <: AbstractFloat, T2 <: Integer}

  CB = similar( X )
  subdims = splitarray( 1:size(X,1), length(C) )
  for i=1:length(C)
    CB[subdims[i], :] = C[i][:, vec(B[i,:]) ]
  end

  mean(sum((R*CB - X).^2, dims=1))
end

"Get the total error of a PQ encoding"
function qerror_pq(
  X::Matrix{T1},
  B::Matrix{T2},
  C::Vector{Matrix{T1}}) where {T1 <: AbstractFloat, T2 <: Integer}
  d = size(X, 1)
  R = Matrix{T1}(1.0I, d, d)
  qerror_opq(X, B, C, R)
end


text:
using DelayDiffEq, OrdinaryDiffEq, RecursiveArrayTools, Test,
      Sundials

function resrob(r,yp,y,p,tres)
    r[1]  = -p[1]*y[1] + 1.0e4*y[2]*y[3]
    r[2]  = -r[1] - 3.0e7*y[2]*y[2] - yp[2]
    r[1] -=  yp[1]
    r[3]  =  y[1] + y[2] + y[3] - 1.0
end
u0 = [1.0, 0, 0]
du0 = [-0.04, 0.04, 0.0]
p = [0.04]
prob = DAEProblem(pf,u0,du0,(0.0,100000.0),p,differential_vars=[3])
sol = solve(prob, IDA())

t = collect(range(0, stop=10, length=30))
randomized = VectorOfArray([(sol(t[i]) + .003randn(3)) for i in 1:length(t)])
data = convert(Array, randomized)

using DiffEqParamEstim, NLopt
cost_function = build_loss_objective(prob,IDA(),L2Loss(t,data),maxiter=10000,
                                          abstol=1e-8,reltol=1e-8,verbose=false)

opt = Opt(:GN_ESCH, 1)
min_objective!(opt, cost_function.cost_function2)
lower_bounds!(opt, [0.0])
upper_bounds!(opt, [1.0])
maxeval!(opt, 10000)

(minf, minx, ret) = NLopt.optimize(opt,[0.2])
@test minx[1] ≈ 0.04 atol=5e-3


text:
#script for the 2D Linear elasticity problem
include("../src/Solver2D.jl")
include("../src/SplinePlotting.jl")

#Material properties
Emod = 1e5
nu = 0.3
Cmat = Emod/(1-nu^2)*[1  nu  0; nu  1  0; 0  0  (1-nu)/2]
material = Material2D(Emod, nu, Cmat)

#symmetry Dirichlet B.C., u_y = 0 for y=0 and u_x=0 for x=0
u_bound_dir_symy0(x,y) = [undef, 0]
u_bound_dir_symx0(x,y) = [0, undef]
# pressure Neumann B.C. τ(x,y) = [x, y] on the circular boundary
bound_press = 10
u_bound_neu(x,y) = bound_press*[x, y]

bound_down = Boundary2D("Dirichlet", "Down", u_bound_dir_symy0)
bound_up = Boundary2D("Dirichlet", "Up", u_bound_dir_symx0)
bound_left = Boundary2D("Neumann", "Left", u_bound_neu)
bound_all = [bound_down, bound_up, bound_left]

#define the domain geometry
rad_int = 1
rad_ext = 4
center = [0., 0.]
sang = 0.
eang = π/2

left_crv =  nrbcirc(rad_int, center, sang, eang)
right_crv = nrbcirc(rad_ext, center, sang, eang)
down_crv = nrbline([rad_int, 0.], [rad_ext, 0.])
up_crv = nrbline([0., rad_int], [0., rad_ext])
nrb = nrbcoons(down_crv, up_crv, left_crv, right_crv)

#degree elevate and refine
degP = [2, 2]
num_subdiv = [20, 20]
new_knots_u = LinRange(0, 1, num_subdiv[1])[2:end-1]
new_knots_v = LinRange(0, 1, num_subdiv[2])[2:end-1]
nrb = nrbdegelev(nrb, degP.+1-nrb.order)
nrb = nrbkntins(nrb, [collect(new_knots_u), collect(new_knots_v)])
# Plots.surface(reuse = false)
# plt = nrbctrlplot(nrb)
# display(plt)

#define the exact solution
function exact_disp(x,y)
    cart2pol(x, y) = hypot(x, y), atan(y, x)
    r, th = cart2pol(x, y)
    u_r = rad_int^2*bound_press*r/(Emod*(rad_ext^2-rad_int^2))*(1-nu+(rad_ext/r)^2*(1+nu))
    return [u_r*cos(th), u_r*sin(th)]
end

function exact_stress(x,y)
    cart2pol(x, y) = hypot(x, y), atan(y, x)
    r, th = cart2pol(x, y)
    sigma_rr = rad_int^2*bound_press/(rad_ext^2-rad_int^2)*(1-rad_ext^2/r^2)
    sigma_tt = rad_int^2*bound_press/(rad_ext^2-rad_int^2)*(1+rad_ext^2/r^2)
    sigma_rt = 0

    A = [cos(th)^2 sin(th)^2 2*sin(th)*cos(th); sin(th)^2 cos(th)^2 -2*sin(th)*cos(th);
        -sin(th)*cos(th) sin(th)*cos(th) cos(th)^2-sin(th)^2]
    stress = A\[sigma_rr;sigma_tt;sigma_rt]
    return stress
end

#generate the NURBS mesh
IGAmesh = genMesh(nrb)

gauss_rule = [genGaussLegendre(degP[1]+1), genGaussLegendre(degP[2]+1)]
stiff = assemble_stiff_elast2D(IGAmesh, Cmat, gauss_rule)
#Assume no body forces
rhs = zeros(2*IGAmesh.numBasis)
bcdof_all, elem_all = classifyBoundary2D(IGAmesh)
lhs, rhs = applyBCnurbsElast(IGAmesh, bound_all, stiff, rhs, bcdof_all, elem_all, gauss_rule)
println("Solving linear system")
@time sol0 = lhs\rhs
@time plotSolElast(IGAmesh, Cmat, sol0, "QuarterAnnulus")
@time plotSolErrorElast(IGAmesh, Cmat, sol0, exact_disp, exact_stress, "QuarterAnnulusErr")
@time relL2Err, relH1Err = compErrorNormElast(IGAmesh, Cmat, sol0, exact_disp, exact_stress, gauss_rule)
println("Relative L2-norm error is $relL2Err")
println("Relative energy-norm error is $relH1Err")


text:
# Interface definition for Soapy SDR devices.

using Base.Meta

# General design rules about the API:
# The caller must free non-const array results.

const LL_DISCLAIMER =
    """
    NOTE: This function is part of the lowlevel libsoapysdr interface.
    For end-users in Julia, the higher-level Julia APIs are preferred
    """

# Forward declaration of device handle
mutable struct SoapySDRDevice
end

# Forward declaration of stream handle
mutable struct SoapySDRStream
end

struct SoapyDeviceError
    msg::String
end

macro check_error(expr)
    quote
        val = $(esc(expr))
        if SoapySDRDevice_lastStatus() == -1
            throw(SoapyDeviceError(unsafe_string(SoapySDRDevice_lastError())))
        end
        val
    end
end

"""
    SoapySDRDevice_lastStatus()

Get the last status code after a Device API call.
The status code is cleared on entry to each Device call.
When an device API call throws, the C bindings catch
the exception, and set a non-zero last status code.
Use lastStatus() to determine success/failure for
Device calls without integer status return codes.

$LL_DISCLAIMER
"""
function SoapySDRDevice_lastStatus()
    ccall((:SoapySDRDevice_lastStatus, lib), Cint, ())
end

# Get the last error message after a device call fails.
# When an device API call throws, the C bindings catch
# the exception, store its message in thread-safe storage,
# and return a non-zero status code to indicate failure.
# Use lastError() to access the exception's error message.
function SoapySDRDevice_lastError()
    ccall((:SoapySDRDevice_lastError, lib), Cstring, ())
end

# Enumerate a list of available devices on the system.
# param args device construction key/value argument filters
# param [out] length the number of elements in the result.
# return a list of arguments strings, each unique to a device
function SoapySDRDevice_enumerate()
    sz = Ref{Csize_t}()
    kwargs = @check_error ccall((:SoapySDRDevice_enumerate, lib), Ptr{SoapySDRKwargs}, (Ptr{Nothing}, Ref{Csize_t}), C_NULL, sz)
    return (kwargs, sz[])
end

# Enumerate a list of available devices on the system.
# Markup format for args: "keyA=valA, keyB=valB".
# param args a markup string of key/value argument filters
# param [out] length the number of elements in the result.
# return a list of arguments strings, each unique to a device
function SoapySDRDevice_enumerateStrArgs(args)
    sz = Ref{Csize_t}()
    kwargs = ccall((:SoapySDRDevice_enumerateStrArgs, lib), Ptr{SoapySDRKwargs}, (Cstring, Ref{Csize_t}), args, sz)
    return (kwargs, sz[])
end

"""
    SoapySDRDevice_make(args)

Make a new Device object given device construction args.
The device pointer will be stored in a table so subsequent calls
with the same arguments will produce the same device.
For every call to make, there should be a matched call to unmake.
param args device construction key/value argument map
return a pointer to a new Device object.

$LL_DISCLAIMER
"""
function SoapySDRDevice_make(args)
    return @check_error ccall((:SoapySDRDevice_make, lib), Ptr{SoapySDRDevice}, (Ref{SoapySDRKwargs},), args)
end

# Make a new Device object given device construction args.
# The device pointer will be stored in a table so subsequent calls
# with the same arguments will produce the same device.
# For every call to make, there should be a matched call to unmake.
#
# param args a markup string of key/value arguments
# return a pointer to a new Device object or null for error
function SoapySDRDevice_makeStrArgs(args) # have not checked
    ccall((:SoapySDRDevice_makeStrArgs, lib), Ptr{SoapySDRDevice}, (Cstring,), args)
end

# Unmake or release a device object handle.
# param device a pointer to a device object
# return 0 for success or error code on failure
function SoapySDRDevice_unmake(device) # have not checked
    ccall((:SoapySDRDevice_unmake, lib), Cint, (Ptr{SoapySDRDevice},), device)
end

######################
## PARALLEL SUPPORT ##      # have not checked any of these
######################

# Create a list of devices from a list of construction arguments.
# This is a convenience call to parallelize device construction,
# and is fundamentally a parallel for loop of make(Kwargs).
#
# \param argsList a list of device arguments per each device
# \param length the length of the argsList array
# \return a list of device pointers per each specified argument
function SoapySDRDevice_make_list(argsList, length::Cint)
    ccall((:SoapySDRDevice_make_list, lib), Ptr{Ptr{SoapySDRDevice}}, (Ptr{Cint}, Cint), argsList, length)
end

# Unmake or release a list of device handles
# and free the devices array memory as well.
# This is a convenience call to parallelize device destruction,
# and is fundamentally a parallel for loop of unmake(Device *).
# param devices a list of pointers to device objects
# param length the length of the devices array
# return 0 for success or error code on failure
function SoapySDRDevice_unmake_list(devices, length::Cint)
    ccall((:SoapySDRDevice_unmake_list, lib), Cint, (Ptr{Ptr{SoapySDRDevice}}, Cint), devices, length)
end

########################
## Identification API ##    # have not checked any of these
########################

# A key that uniquely identifies the device driver.
# This key identifies the underlying implementation.
# Serveral variants of a product may share a driver.
# param device a pointer to a device instance
function SoapySDRDevice_getDriverKey(device)
    ccall((:SoapySDRDevice_getDriverKey, lib), Cstring, (Ptr{SoapySDRDevice},), device)
end

# A key that uniquely identifies the hardware.
# This key should be meaningful to the user
# to optimize for the underlying hardware.
# \param device a pointer to a device instance
function SoapySDRDevice_getHardwareKey(device)
    ccall((:SoapySDRDevice_getHardwareKey, lib), Cstring, (Ptr{SoapySDRDevice},), device)
end

# Query a dictionary of available device information.
# This dictionary can any number of values like
# vendor name, product name, revisions, serials...
# This information can be displayed to the user
# to help identify the instantiated device.
# \param device a pointer to a device instance
function SoapySDRDevice_getHardwareInfo(device)
    ccall((:SoapySDRDevice_getHardwareInfo, lib), SoapySDRKwargs, (Ptr{SoapySDRDevice},), device)
end

# Get a number of channels given the streaming direction
# param device a pointer to a device instance
# param direction the channel direction RX or TX
# return the number of channels
function SoapySDRDevice_getNumChannels(device, direction)
    num_channels = ccall((:SoapySDRDevice_getNumChannels, lib), Csize_t, (Ptr{SoapySDRDevice}, Cint), device, direction)
    return Int(num_channels)
end

const CHANNEL_ARGS = """
*  `device` a pointer to a device instance
*  `direction` the channel direction RX or TX
*  `channel` the channel number to get info for
"""

"""
    SoapySDRDevice_getChannelInfo(device, direction, channel)

Get channel info given the streaming direction
$CHANNEL_ARGS

Returns channel information

$LL_DISCLAIMER
"""
function SoapySDRDevice_getChannelInfo(device, direction, channel);
    return @check_error ccall((:SoapySDRDevice_getChannelInfo, lib), SoapySDRKwargs, (Ptr{SoapySDRDevice}, Cint, Csize_t), device, direction, channel)
end

#################
## ANTENNA API ##
#################

"""
Get a list of available antennas to select on a given chain.

$CHANNEL_ARGS

returns a list of available antenna names

$LL_DISCLAIMER
"""
function SoapySDRDevice_listAntennas(device, direction, channel)
    num_antennas = Ref{Csize_t}()
    names = @check_error ccall((:SoapySDRDevice_listAntennas, lib), Ptr{Cstring}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, num_antennas)
    return (names, num_antennas[])
end

##############
## GAIN API ##
##############

# List available amplification elements.
# Elements should be in order RF to baseband.
# param device a pointer to a device instance
# param direction the channel direction RX or TX
# param channel an available channel
# param [out] length the number of gain names
# return a list of gain string names
function SoapySDRDevice_listGains(device, direction, channel)
    num_gains = Ref{Csize_t}()
    names = @check_error ccall((:SoapySDRDevice_listGains, lib), Ptr{Cstring}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, num_gains)
    names, num_gains[]
end

function SoapySDRDevice_getGainElement(device, direction, channel, name)
    return @check_error ccall((:SoapySDRDevice_getGainElement, lib), Cdouble, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring),
        device, direction, channel, name)
end

function SoapySDRDevice_setGainElement(device, direction, channel, name, val)
    err = @check_error ccall((:SoapySDRDevice_getGainElement, lib), Cint, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring, Cdouble),
        device, direction, channel, name, val)
    @assert err == 0
    return nothing
end

#=
"""
Get the overall value of the gain elements in a chain.

$CHANNEL_ARGS

Returns the value of the gain in dB
"""
function SoapySDRDevice_getGain(device, direction, channel)
    return @check_error ccall((:SoapySDRDevice_getGain, lib), Cdouble, (Ptr{SoapySDRDevice}, Cint, Csize_t),
        device, direction, channel)
end
=#

"""
Get the overall range of possible gain values

$CHANNEL_ARGS

Returns the range of possible gain values for this channel in dB
"""
function SoapySDRDevice_getGainRange(device, direction, channel)
    range = @check_error ccall((:SoapySDRDevice_getGainRange, lib), SoapySDRRange, (Ptr{SoapySDRDevice}, Cint, Csize_t),
        device, direction, channel)
    return range
end

"""
    SoapySDRDevice_getGainElementRange(device, direction, channel, name)

    Get the range of possible gain values for a specific element.

$CHANNEL_ARGS
* `name` the name of an amplification element

Returns the range of possible gain values for the specified amplification element in dB

$LL_DISCLAIMER
"""
function SoapySDRDevice_getGainElementRange(device, direction, channel, name)
    range = @check_error ccall((:SoapySDRDevice_getGainElementRange, lib), SoapySDRRange, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring),
        device, direction, channel, name)
    return range
end

###################
## FREQUENCY API ##
###################

# Set the center frequency of the chain.
#  - For RX, this specifies the down-conversion frequency.
#  - For TX, this specifies the up-conversion frequency.
# The default implementation of setFrequency() will tune the "RF"
# component as close as possible to the requested center frequency.
# Tuning inaccuracies will be compensated for with the "BB" component.
# The args can be used to augment the tuning algorithm.
#  - Use "OFFSET" to specify an "RF" tuning offset,
#    usually with the intention of moving the LO out of the passband.
#    The offset will be compensated for using the "BB" component.
#  - Use the name of a component for the key and a frequency in Hz
#    as the value (any format) to enforce a specific frequency.
#    The other components will be tuned with compensation
#    to achieve the specified overall frequency.
#  - Use the name of a component for the key and the value "IGNORE"
#    so that the tuning algorithm will avoid altering the component.
#  - Vendor specific implementations can also use the same args to augment
#    tuning in other ways such as specifying fractional vs integer N tuning.
# param device a pointer to a device instance
# param direction the channel direction RX or TX
# param channel an available channel on the device
# param frequency the center frequency in Hz
# param args optional tuner arguments
# return an error code or 0 for success
function SoapySDRDevice_setFrequency(device, direction, channel, frequency, kwargs)
    ccall((:SoapySDRDevice_setFrequency, lib), Int, (Ref{SoapySDRDevice}, Cint, Csize_t, Cdouble, Ptr{SoapySDRKwargs}), device, direction, channel, frequency, kwargs)
end

################
## STREAM API ##
################

"""
Query a list of the available stream formats.

$CHANNEL_ARGS

Returns a list of allowed format strings.

$LL_DISCLAIMER
"""
function SoapySDRDevice_getStreamFormats(device, direction, channel)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_getStreamFormats, lib), Ptr{Cstring}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, len)
    ptr, len[]
end

"""
Initialize a stream given a list of channels and stream arguments.
The implementation may change switches or power-up components.
All stream API calls should be usable with the new stream object
after setupStream() is complete, regardless of the activity state.

The API allows any number of simultaneous TX and RX streams, but many dual-channel
devices are limited to one stream in each direction, using either one or both channels.
This call will return an error if an unsupported combination is requested,
or if a requested channel in this direction is already in use by another stream.

When multiple channels are added to a stream, they are typically expected to have
the same sample rate. See SoapySDRDevice_setSampleRate().

 * `device` a pointer to a device instance
 * `direction` the channel direction (`SOAPY_SDR_RX` or `SOAPY_SDR_TX`)
 * `format` A string representing the desired buffer format in read/writeStream()

 The first character selects the number type:
   - "C" means complex
   - "F" means floating point
   - "S" means signed integer
   - "U" means unsigned integer

 The type character is followed by the number of bits per number (complex is 2x this size per sample)

  Example format strings:
   - "CF32" -  complex float32 (8 bytes per element)
   - "CS16" -  complex int16 (4 bytes per element)
   - "CS12" -  complex int12 (3 bytes per element)
   - "CS4" -  complex int4 (1 byte per element)
   - "S32" -  int32 (4 bytes per element)
   - "U8" -  uint8 (1 byte per element)

 * `channels` a list of channels or empty for automatic
 * `numChans` the number of elements in the channels array
 * `args` stream args or empty for defaults

Recommended keys to use in the args dictionary:
    - "WIRE" - format of the samples between device and host

Returns the opaque pointer to a stream handle.

# NOTE:
    The returned stream is not required to have internal locking, and may not be used
    concurrently from multiple threads.
"""
function SoapySDRDevice_setupStream(device, direction, format, channels, numChans, kwargs)
    return @check_error ccall((:SoapySDRDevice_setupStream, lib), Ptr{SoapySDRStream}, (Ptr{SoapySDRDevice}, Cint, Cstring, Ptr{Csize_t}, Csize_t, Ptr{SoapySDRKwargs}),
        device, direction, format, channels, numChans, kwargs)
end

# Activate a stream.
# Call activate to prepare a stream before using read/write().
# The implementation control switches or stimulate data flow.
#
# The timeNs is only valid when the flags have SOAPY_SDR_HAS_TIME.
# The numElems count can be used to request a finite burst size.
# The SOAPY_SDR_END_BURST flag can signal end on the finite burst.
# Not all implementations will support the full range of options.
# In this case, the implementation returns SOAPY_SDR_NOT_SUPPORTED.
#
# param device a pointer to a device instance
# param stream the opaque pointer to a stream handle
# param flags optional flag indicators about the stream
# param timeNs optional activation time in nanoseconds
# param numElems optional element count for burst control
# return 0 for success or error code on failure
function SoapySDRDevice_activateStream(device, stream, flags, timeNs, numElems)
    err = @check_error ccall((:SoapySDRDevice_activateStream, lib), Cint, (Ptr{SoapySDRDevice}, Ptr{SoapySDRStream}, Cint, Clonglong, Csize_t), device, stream, flags, timeNs, numElems)
    if err != 0
        throw(SoapySDRAPIError(err))
    end
    return nothing
end

# Read elements from a stream for reception.
# This is a multi-channel call, and buffs should be an array of void *,
# where each pointer will be filled with data from a different channel.
#
# **Client code compatibility:**
# The readStream() call should be well defined at all times,
# including prior to activation and after deactivation.
# When inactive, readStream() should implement the timeout
# specified by the caller and return SOAPY_SDR_TIMEOUT.
#
# param device a pointer to a device instance
# param stream the opaque pointer to a stream handle
# param buffs an array of void* buffers num chans in size
# param numElems the number of elements in each buffer
# param [out] flags optional flag indicators about the result
# param [out] timeNs the buffer's timestamp in nanoseconds
# param timeoutUs the timeout in microseconds
# return the number of elements read per buffer or error code
function SoapySDRDevice_readStream(device, stream, buffs, numElems, timeoutUs)
    flags = Ref{Cint}()
    timeNs = Ref{Clonglong}()
    nelems = @check_error ccall((:SoapySDRDevice_readStream, lib), Cint, (Ptr{SoapySDRDevice}, Ptr{SoapySDRStream}, Ptr{Cvoid}, Csize_t, Ptr{Cint}, Ptr{Clonglong}, Clong),
        device, stream, buffs, numElems, flags, timeNs, timeoutUs)
    if nelems < 0
        throw(SoapySDRAPIError(nelems))
    end
    nelems, flags[], timeNs[]
end

"""
Write elements to a stream for transmission.
This is a multi-channel call, and buffs should be an array of void *,
where each pointer will be filled with data for a different channel.

**Client code compatibility:**
Client code relies on writeStream() for proper back-pressure.
The writeStream() implementation must enforce the timeout
such that the call blocks until space becomes available
or timeout expiration.

* `device` a pointer to a device instance
* `stream` the opaque pointer to a stream handle
* `buffs` an array of void* buffers num chans in size
* `numElems` the number of elements in each buffer
* `flags` optional input flags and output flags
* `timeNs` the buffer's timestamp in nanoseconds
* `timeoutUs` the timeout in microseconds

Returns the number of elements written per buffer, output flags
"""
function SoapySDRDevice_writeStream(device, stream, buffs, numElems, flags, timeNs, timeoutUs)
    flags = Ref{Cint}(flags)
    nelems = @check_error ccall((:SoapySDRDevice_writeStream, lib), Cint, (Ptr{SoapySDRDevice}, Ptr{SoapySDRStream}, Ptr{Cvoid}, Csize_t, Ptr{Cint}, Clonglong, Clong),
        device, stream, buffs, numElems, flags, timeNs, timeoutUs)
    if nelems < 0
        throw(SoapySDRAPIError(nelems))
    end
    nelems, flags[]
end

# Deactivate a stream.
# Call deactivate when not using using read/write().
# The implementation control switches or halt data flow.
#
# The timeNs is only valid when the flags have SOAPY_SDR_HAS_TIME.
# Not all implementations will support the full range of options.
# In this case, the implementation returns SOAPY_SDR_NOT_SUPPORTED.
#
# param device a pointer to a device instance
# param stream the opaque pointer to a stream handle
# param flags optional flag indicators about the stream
# param timeNs optional deactivation time in nanoseconds
# return 0 for success or error code on failure
function SoapySDRDevice_deactivateStream(device, stream, flags, timeNs)
    ccall((:SoapySDRDevice_deactivateStream, lib), Cint, (Ptr{SoapySDRDevice}, Ptr{SoapySDRStream}, Cint, Clonglong), device, stream, flags, timeNs)
end

# Close an open stream created by setupStream
# param device a pointer to a device instance
# param stream the opaque pointer to a stream handle
# return 0 for success or error code on failure
function SoapySDRDevice_closeStream(device, stream)
    @check_error ccall((:SoapySDRDevice_closeStream, lib), Cint, (Ptr{SoapySDRDevice}, Ptr{SoapySDRStream}), device, stream)
end

### Various channel queries
for (prop, T, may_be_missing, desc) in [
        (:DCOffsetMode, Bool, true, "automatic DC offset corrections mode"),
        (:IQBalanceMode, Bool, true, "automatic IQ balance corrections mode"),
        (:GainMode, Bool, true, "automatic gain control mode"),
        (:FrequencyCorrection, Cdouble, true, "frontend frequency correction"),
        (:Gain, Cdouble, false, "gain in dB"),
        (:Antenna, Cstring, false, "selected antenna"),
        (:Bandwidth, Cdouble, false, "bandwidth in Hz"),
        (:SampleRate, Cdouble, false, "sample rate in Hz"),
    ]

    has_sym = Symbol(string("SoapySDRDevice_has"), prop)
    get_sym = Symbol(string("SoapySDRDevice_get"), prop)
    set_sym = Symbol(string("SoapySDRDevice_set"), prop)

    if may_be_missing
        """
        Does the device suppport $desc

        $CHANNEL_ARGS

        $LL_DISCLAIMER
        """
        @eval function ($has_sym)(device, direction, channel)
            return ccall(($(quot(has_sym)), lib), Bool, (Ref{SoapySDRDevice}, Cint, Csize_t), device, direction, channel)
        end
    end

    """
    Get the $desc.

    $CHANNEL_ARGS

    Returns the $desc.

    $LL_DISCLAIMER
    """
    @eval function ($get_sym)(device, direction, channel)
        return ccall(($(quot(get_sym)), lib), $T, (Ref{SoapySDRDevice}, Cint, Csize_t), device, direction, channel)
    end

    """
    Set the $desc.

    $CHANNEL_ARGS
    * `value` set the $desc to this `value`

    $LL_DISCLAIMER
    """
    @eval function ($set_sym)(device, direction, channel, value)
        return ccall(($(quot(set_sym)), lib), Cint, (Ref{SoapySDRDevice}, Cint, Csize_t, $T), device, direction, channel, value)
    end
end

for (prop, desc) in [
    (:IQBalance, "frontend IQ balance correction"),
    (:DCOffset, "frontend DC offset correction")
]

    has_sym = Symbol(string("SoapySDRDevice_has"), prop)
    get_sym = Symbol(string("SoapySDRDevice_get"), prop)
    set_sym = Symbol(string("SoapySDRDevice_set"), prop)

    """
    Does the device suppport $desc?

    $CHANNEL_ARGS
    $LL_DISCLAIMER
    """
    @eval function ($has_sym)(device, direction, channel)
        return @check_error ccall(($(quot(has_sym)), lib), Bool, (Ref{SoapySDRDevice}, Cint, Csize_t),
            device, direction, channel)
    end

    """
    Get the $desc.

    $CHANNEL_ARGS
    $LL_DISCLAIMER
    """
    @eval function ($get_sym)(device, direction, channel)
        i = Ref{Cdouble}()
        q = Ref{Cdouble}()
        @check_error ccall(($(quot(get_sym)), lib), Cint, (Ref{SoapySDRDevice}, Cint, Csize_t, Ref{Cdouble}, Ref{Cdouble}),
            device, direction, channel, i, q)
        (i[], q[])
    end

    """
    Set the $desc.

    $CHANNEL_ARGS
    $LL_DISCLAIMER
    """
    @eval function ($set_sym)(device, direction, channel, i, q)
        @check_error ccall(($(quot(set_sym)), lib), Cint, (Ref{SoapySDRDevice}, Cint, Csize_t, Cdouble, Cdouble),
            device, direction, channel, i, q)
    end
end

function SoapySDRDevice_getBandwidthRange(device, direction, channel)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_getBandwidthRange, lib), Ptr{SoapySDRRange}, (Ref{SoapySDRDevice}, Cint, Csize_t, Ptr{Csize_t}), device, direction, channel, len)
    (ptr, len[])
end

###################
## FREQUENCY API ##
###################

"""
Get the range of overall frequency values.

$CHANNEL_ARGS

Returns a list of frequency ranges in Hz

$LL_DISCLAIMER
"""
function SoapySDRDevice_getFrequencyRange(device, direction, channel)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_getFrequencyRange, lib), Ptr{SoapySDRRange}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, len)
    (ptr, len[])
end

"""
Get the range of tunable values for the specified element.

$CHANNEL_ARGS

Returns a list of frequency ranges in Hz

$LL_DISCLAIMER
"""
function SoapySDRDevice_getFrequencyRangeComponent(device, direction, channel, name)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_getFrequencyRangeComponent, lib), Ptr{SoapySDRRange}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring, Ref{Csize_t}), device, direction, channel, name, len)
    (ptr, len[])
end

"""
Get the range of possible baseband sample rates.

$CHANNEL_ARGS

Returns a list of samples rates in samples per second

$LL_DISCLAIMER
"""
function SoapySDRDevice_getSampleRateRange(device, direction, channel)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_getSampleRateRange, lib), Ptr{SoapySDRRange}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, len)
    (ptr, len[])
end

"""
List available tunable elements in the chain.
Elements should be in order RF to baseband.

$CHANNEL_ARGS

Returns a list of tunable elements by name

$LL_DISCLAIMER
*/
"""
function SoapySDRDevice_listFrequencies(device, direction, channel)
    len = Ref{Csize_t}()
    ptr = @check_error ccall((:SoapySDRDevice_listFrequencies, lib), Ptr{Cstring}, (Ptr{SoapySDRDevice}, Cint, Csize_t, Ref{Csize_t}), device, direction, channel, len)
    ptr, len[]
end

function SoapySDRDevice_getFrequency(device, direction, channel)
    return @check_error ccall((:SoapySDRDevice_getFrequency, lib), Cdouble, (Ptr{SoapySDRDevice}, Cint, Csize_t),
        device, direction, channel)
end

function SoapySDRDevice_getFrequencyComponent(device, direction, channel, name)
    return @check_error ccall((:SoapySDRDevice_getFrequencyComponent, lib), Cdouble, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring),
        device, direction, channel, name)
end

function SoapySDRDevice_setFrequencyComponent(device, direction, channel, name, val)
    err = @check_error ccall((:SoapySDRDevice_setFrequencyComponent, lib), Cint, (Ptr{SoapySDRDevice}, Cint, Csize_t, Cstring, Cdouble),
        device, direction, channel, name, val)
    @assert err == 0
    return nothing
end