{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "description": "The queue pickup policies configuration",
    "markdownDescription": "The [queue pickup policies](https://docs.halon.io/manual/archive/master/queue.html#queue-pickup-policies) configuration",
    "additionalProperties": false,
    "required": [
        "version"
    ],
    "properties": {
        "version": {
            "type": "string",
            "enum": [
                "6.11"
            ],
            "description": "The software version the configuration was created for"
        },
        "policies": {
            "type": "array",
            "uniqueItems": false,
            "description": "The policies",
            "items": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                    "fields": {
                        "type": "array",
                        "minItems": 1,
                        "items": {
                            "oneOf": [
                                {
                                    "type": "string",
                                    "enum": [
                                        "jobid",
                                        "tenantid",
                                        "grouping",
                                        "localip",
                                        "remoteip",
                                        "transportid",
                                        "recipientdomain",
                                        "remotemx"
                                    ]
                                },
                                {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "minProperties": 1,
                                    "maxProperties": 1,
                                    "properties": {
                                        "jobid": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/jobid"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "tenantid": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/tenantid"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "grouping": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/wildcard"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/grouping"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "localip": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv4"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv4net"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv6"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv6net"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "remoteip": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv4"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv4net"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv6"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/ipv6net"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "transportid": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/objectid"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "recipientdomain": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/wildcard"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/domain"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        },
                                        "remotemx": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "array",
                                                "minItems": 1,
                                                "items": {
                                                    "oneOf": [
                                                        {
                                                            "$ref": "#/definitions/list"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/wildcard"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/regex"
                                                        },
                                                        {
                                                            "$ref": "#/definitions/domain"
                                                        }
                                                    ]
                                                }
                                            },
                                            "minProperties": 1
                                        }
                                    }
                                }
                            ]
                        }
                    },
                    "conditions": {
                        "type": "array",
                        "minItems": 1,
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "required": [
                                "if",
                                "then"
                            ],
                            "properties": {
                                "if": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "minProperties": 1,
                                    "properties": {
                                        "jobid": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/jobid"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/jobid"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "tenantid": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/tenantid"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/tenantid"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "grouping": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/wildcard"
                                                },
                                                {
                                                    "$ref": "#/definitions/grouping"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/wildcard"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/grouping"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "localip": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv4"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv4net"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv6"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv6net"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv4"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv4net"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv6"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv6net"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "remoteip": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv4"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv4net"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv6"
                                                },
                                                {
                                                    "$ref": "#/definitions/ipv6net"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv4"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv4net"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv6"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ipv6net"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "transportid": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/objectid"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/objectid"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "recipientdomain": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/domain"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/wildcard"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/domain"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/wildcard"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        },
                                        "remotemx": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/list"
                                                },
                                                {
                                                    "$ref": "#/definitions/domain"
                                                },
                                                {
                                                    "$ref": "#/definitions/ref"
                                                },
                                                {
                                                    "$ref": "#/definitions/wildcard"
                                                },
                                                {
                                                    "$ref": "#/definitions/regex"
                                                },
                                                {
                                                    "type": "array",
                                                    "minItems": 1,
                                                    "items": {
                                                        "oneOf": [
                                                            {
                                                                "$ref": "#/definitions/list"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/domain"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/ref"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/wildcard"
                                                            },
                                                            {
                                                                "$ref": "#/definitions/regex"
                                                            }
                                                        ]
                                                    }
                                                }
                                            ]
                                        }
                                    }
                                },
                                "then": {
                                    "type": "object",
                                    "additionalProperties": false,
                                    "minProperties": 1,
                                    "properties": {
                                        "rate": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/rate"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "concurrency": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/concurrency"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "connectinterval": {
                                            "oneOf": [
                                                {
                                                    "$ref": "#/definitions/connectinterval"
                                                },
                                                {
                                                    "type": "null"
                                                }
                                            ]
                                        },
                                        "tag": {
                                            "$ref": "#/definitions/tag"
                                        },
                                        "properties": {
                                            "$ref": "#/definitions/properties"
                                        },
                                        "stop": {
                                            "type": "boolean",
                                            "default": false
                                        },
                                        "cluster": {
                                            "type": "boolean",
                                            "default": true
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "default": {
                        "type": "object",
                        "additionalProperties": false,
                        "minProperties": 1,
                        "properties": {
                            "rate": {
                                "$ref": "#/definitions/rate"
                            },
                            "concurrency": {
                                "$ref": "#/definitions/concurrency"
                            },
                            "connectinterval": {
                                "$ref": "#/definitions/connectinterval"
                            },
                            "tag": {
                                "$ref": "#/definitions/tag"
                            },
                            "properties": {
                                "$ref": "#/definitions/properties"
                            },
                            "cluster": {
                                "type": "boolean",
                                "default": true
                            }
                        }
                    }
                }
            }
        },
        "rate": {
            "type": "object",
            "description": "Rate settings",
            "additionalProperties": false,
            "properties": {
                "algorithm": {
                    "type": "string",
                    "enum": [
                        "fixedwindow",
                        "tokenbucket"
                    ],
                    "default": "fixedwindow",
                    "description": "The rate algorithm to use"
                }
            }
        }
    },
    "definitions": {
        "list": {
            "type": "string",
            "pattern": "^@[a-zA-Z0-9-_.]+$",
            "minLength": 2,
            "maxLength": 64
        },
        "properties": {
            "type": "object",
            "additionalProperties": {
                "oneOf": [
                    {
                        "type": "string",
                        "minLength": 1
                    },
                    {
                        "type": "number"
                    },
                    {
                        "type": "boolean"
                    }
                ]
            }
        },
        "jobid": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$).*$",
            "minLength": 1
        },
        "tenantid": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$).*$",
            "minLength": 1
        },
        "grouping": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$).*$",
            "minLength": 1
        },
        "objectid": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9-_.]+$",
            "minLength": 1,
            "maxLength": 64
        },
        "tag": {
            "type": "string",
            "pattern": "^[a-zA-Z0-9_.-]+$",
            "minLength": 1,
            "maxLength": 32
        },
        "domain": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$)[a-zA-Z0-9_.-]+$",
            "minLength": 1
        },
        "ipv4": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$)(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(\\.(?!$)|$)){4}$",
            "minLength": 7
        },
        "ipv4net": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$)(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(\\.(?!$)|\/[0-9]+$)){4}$",
            "minLength": 9
        },
        "ipv6": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$)(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$",
            "minLength": 3
        },
        "ipv6net": {
            "type": "string",
            "pattern": "^(?!(?:\/.*\/|[#@].*|.*[*].*)$)(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/[0-9]+$",
            "minLength": 3
        },
        "concurrency": {
            "type": "number",
            "minimum": 1
        },
        "connectinterval": {
            "type": "number",
            "minimum": 1
        },
        "rate": {
            "oneOf": [
                {
                    "type": "string",
                    "pattern": "^[0-9]+(/[0-9]+(\\.[0-9]+)?)?$",
                    "minLength": 1
                },
                {
                    "type": "number",
                    "minimum": 1
                },
                {
                    "type": "object",
                    "required": [
                        "algorithm",
                        "value"
                    ],
                    "additionalProperties": {
                        "algorithm": {
                            "type": "string",
                            "enum": [
                                "fixedwindow",
                                "tokenbucket"
                            ],
                            "description": "The rate algorithm to use"
                        },
                        "value": {
                            "oneOf": [
                                {
                                    "type": "string",
                                    "pattern": "^[0-9]+(/[0-9]+(\\.[0-9]+)?)?$",
                                    "minLength": 1
                                },
                                {
                                    "type": "number",
                                    "minimum": 1
                                }
                            ]
                        }
                    }
                }
            ]
        },
        "ref": {
            "type": "string",
            "pattern": "^#.+$",
            "minLength": 2
        },
        "regex": {
            "type": "string",
            "pattern": "^/.*/$",
            "minLength": 2
        },
        "wildcard": {
            "type": "string",
            "pattern": "^[*][.][a-zA-Z0-9_.-]+$",
            "minLength": 3
        }
    }
}