Skip to content

Commit

Permalink
Merge pull request #9 from conekta/nikunjy-base
Browse files Browse the repository at this point in the history
merge Nikunjy base
  • Loading branch information
ezerozen authored Jan 9, 2024
2 parents 6fbcbc5 + 65c5990 commit 247bc07
Show file tree
Hide file tree
Showing 18 changed files with 1,302 additions and 759 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ jobs:
runs-on: ubuntu-latest
steps:

- name: Set up Go 1.17
- name: Set up Go 1.21
uses: actions/setup-go@v1
with:
go-version: 1.17
go-version: 1.21
id: go

- name: Check out code into the Go module directory
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ vendor
fmt.log
lint.log
.idea
.vscode
71 changes: 39 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Golang Rules Engine [![Build Status][ci-img]][ci] [![codecov](https://codecov.io/gh/nikunjy/rules/branch/master/graph/badge.svg)](https://codecov.io/gh/nikunjy/rules)
Rules engine written in golang with the help of antlr.
# Golang Rules Engine

This package will be very helpful in situations where you have a generic rule and want to verify if your values (specified using `map[string]interface{}`) satisfy the rule.
Rules engine written in golang with the help of antlr.

This package will be very helpful in situations where you have a generic rule and want to verify if your values (specified using `map[string]interface{}`) satisfy the rule.

Here are some examples:

Expand All @@ -12,7 +12,7 @@ Here are some examples:
parser.Evaluate("x lt 1", map[string]interface{}{"x": 1})
parser.Evaluate("x < 1", map[string]interface{}{"x": 1})
parser.Evaluate("x gt 1", map[string]interface{}{"x": 1})
parser.Evaluate("x.a == 1 and x.b.c <= 2", map[string]interface{}{
"x": map[string]interface{}{
"a": 1,
Expand All @@ -21,48 +21,55 @@ Here are some examples:
},
},
})
parser.Evaluate("y == 4 and (x > 1)", map[string]interface{}{"x": 1})
parser.Evaluate("y == 4 and (x IN [1,2,3])", map[string]interface{}{"x": 1})
parser.Evaluate("y == 4 and (x eq 1.2.3)", map[string]interface{}{"x": "1.2.3"})
```

## Operations

All the operations can be written capitalized or lowercase (ex: `eq` or `EQ` can be used)

Logical Operations supported are `AND OR`
Logical Operations supported are `and` `or`

Compare Expression and their definitions (a|b means you can use either one of the two a or b):
```
eq|==: equals to
ne|!=: not equals to
lt|<: less than
gt|>: greater than
le|<=: less than equal to
ge|>=: greater than equal to
co: contains
sw: starts with
ew: ends with
in: in a list
pr: present
not: not of a logical expression
```
Compare Expression and their definitions

| expression | meaning |
-------------|------------
| eq | equals to |
| == | equals to |
| ne | not equal to |
| != | not equal to |
| lt | less than |
| < | less than |
| gt | greater than |
| > | greter than |
| le | less than or equal to |
| <= | less than or equal to |
| ge | greater than or equal to|
| >= | greater than or equal to|
| co | contains |
| sw | starts with |
| ew | ends with |
| in | in a list |
| pr | present, will be true if you have a key as true |
| not | not of a logical expression |

## How to use it
Use your dependency manager to import `github.com/nikunjy/rules/parser`. This will let you parse a rule and keep the parsed representation around.
Alternatively, you can also use `github.com/nikunjy/rules` directly to call the root `Evaluate(string, map[string]interface{})` method.
## How to use it

I would recommend importing `github.com/nikunjy/rules/parser`
Use your dependency manager to import `github.com/nikunjy/rules/parser`. This will let you parse a rule and keep the parsed representation around.
Alternatively, you can also use `github.com/nikunjy/rules` directly to call the root `Evaluate(string, map[string]interface{})` method.

I would recommend importing `github.com/nikunjy/rules/parser`

## How to extend the grammar
1. Please look at this [antlr tutorial](https://tomassetti.me/antlr-mega-tutorial/#setup-antlr), the link will show you how to setup antlr.
The article has a whole lot of detail about antlr I encourage you to read it, you might also like [my blog post](https://medium.com/@nikunjyadav/generic-rules-engine-in-golang-using-antlr-d30a0d0bb565) about this repo.
2. After taking a look at the antlr tutorial, you can extend the [JsonQuery.g4 file](https://github.com/nikunjy/rules/blob/master/parser/JsonQuery.g4).
3. Compile the parser `antlr4 -Dlanguage=Go -visitor -no-listener JsonQuery.g4 -o ./` (Note: `-o` is the output directory, make sure all the stuff it generates is in the `parser` directory of the root repo folder)

[ci-img]: https://api.travis-ci.org/nikunjy/rules.svg?branch=master
[ci]: https://travis-ci.org/nikunjy/rules
1. Please look at this [antlr tutorial](https://tomassetti.me/antlr-mega-tutorial/#setup-antlr), the link will show you how to setup antlr.
The article has a whole lot of detail about antlr I encourage you to read it, you might also like [my blog post](https://medium.com/@nikunjyadav/generic-rules-engine-in-golang-using-antlr-d30a0d0bb565) about this repo.
2. After taking a look at the antlr tutorial, you can extend the [JsonQuery.g4 file](https://github.com/nikunjy/rules/blob/master/parser/JsonQuery.g4).
3. Compile the parser `antlr4 -Dlanguage=Go -visitor -no-listener JsonQuery.g4 -o ./` (Note: `-o` is the output directory, make sure all the stuff it generates is in the `parser` directory of the root repo folder)
8 changes: 4 additions & 4 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,24 @@ package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"

"github.com/conekta/Conekta-Golang-Rules-Engine/parser"
)

func main() {
jsonFile, err := ioutil.ReadFile("test.json")
jsonFile, err := os.ReadFile("test.json")
if err != nil {
log.Fatal(fmt.Errorf("error reading obj from file %v", err))
}
rulesBytes, err := ioutil.ReadFile("rules.txt")
rulesBytes, err := os.ReadFile("rules.txt")
if err != nil {
log.Fatal(fmt.Errorf("error reading rule from file %v", err))
}
var rulesString = string(rulesBytes)
var info map[string]interface{}
json.Unmarshal([]byte(jsonFile), &info)
json.Unmarshal(jsonFile, &info)
ev, err := parser.NewEvaluator(rulesString)
if err != nil {
log.Fatal(fmt.Errorf("error making evaluator from the rule %v, %v", rulesString, err))
Expand Down
7 changes: 4 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
module github.com/conekta/Conekta-Golang-Rules-Engine

go 1.17
go 1.21

require (
github.com/antlr/antlr4 v0.0.0-20181218183524-be58ebffde8e
github.com/blang/semver v0.0.0-20190414102917-ba2c2ddd8906
github.com/antlr4-go/antlr/v4 v4.13.0
github.com/blang/semver v3.5.1+incompatible
github.com/stretchr/testify v1.3.0
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect
)
10 changes: 6 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
github.com/antlr/antlr4 v0.0.0-20181218183524-be58ebffde8e h1:yxMh4HIdsSh2EqxUESWvzszYMNzOugRyYCeohfwNULM=
github.com/antlr/antlr4 v0.0.0-20181218183524-be58ebffde8e/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y=
github.com/blang/semver v0.0.0-20190414102917-ba2c2ddd8906 h1:KGe2go3VELJLcQfKBUlviUzERqg79dO6VYzCvQxF01w=
github.com/blang/semver v0.0.0-20190414102917-ba2c2ddd8906/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -10,3 +10,5 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
4 changes: 2 additions & 2 deletions parser/JsonQuery.g4
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
grammar JsonQuery;

query
: NOT? SP? '(' query ')' #parenExp
: NOT? SP? '(' SP? query SP? ')' #parenExp
| query SP LOGICAL_OPERATOR SP query #logicalExp
| attrPath SP 'pr' #presentExp
| attrPath SP op=( EQ | NE | GT | LT | GE | LE | CO | SW | EW | IN ) SP value #compareExp
Expand Down Expand Up @@ -76,7 +76,7 @@ value
;

VERSION
: INT '.' INT '.' INT
: INT '.' INT '.' INT
;

STRING
Expand Down
2 changes: 1 addition & 1 deletion parser/JsonQuery.interp
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,4 @@ subListOfInts


atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 36, 133, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 3, 2, 3, 2, 5, 2, 29, 10, 2, 3, 2, 5, 2, 32, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 58, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 7, 2, 65, 10, 2, 12, 2, 14, 2, 68, 11, 2, 3, 3, 3, 3, 5, 3, 72, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 83, 10, 5, 3, 5, 3, 5, 5, 5, 87, 10, 5, 3, 5, 3, 5, 3, 5, 5, 5, 92, 10, 5, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 102, 10, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 112, 10, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 5, 11, 121, 10, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 131, 10, 13, 3, 13, 2, 3, 2, 14, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 2, 5, 3, 2, 14, 23, 3, 2, 24, 27, 3, 2, 15, 20, 2, 141, 2, 57, 3, 2, 2, 2, 4, 69, 3, 2, 2, 2, 6, 73, 3, 2, 2, 2, 8, 91, 3, 2, 2, 2, 10, 93, 3, 2, 2, 2, 12, 101, 3, 2, 2, 2, 14, 103, 3, 2, 2, 2, 16, 111, 3, 2, 2, 2, 18, 113, 3, 2, 2, 2, 20, 120, 3, 2, 2, 2, 22, 122, 3, 2, 2, 2, 24, 130, 3, 2, 2, 2, 26, 28, 8, 2, 1, 2, 27, 29, 7, 10, 2, 2, 28, 27, 3, 2, 2, 2, 28, 29, 3, 2, 2, 2, 29, 31, 3, 2, 2, 2, 30, 32, 7, 36, 2, 2, 31, 30, 3, 2, 2, 2, 31, 32, 3, 2, 2, 2, 32, 33, 3, 2, 2, 2, 33, 34, 7, 3, 2, 2, 34, 35, 5, 2, 2, 2, 35, 36, 7, 4, 2, 2, 36, 58, 3, 2, 2, 2, 37, 38, 5, 4, 3, 2, 38, 39, 7, 36, 2, 2, 39, 40, 7, 5, 2, 2, 40, 58, 3, 2, 2, 2, 41, 42, 5, 4, 3, 2, 42, 43, 7, 36, 2, 2, 43, 44, 9, 2, 2, 2, 44, 45, 7, 36, 2, 2, 45, 46, 5, 8, 5, 2, 46, 58, 3, 2, 2, 2, 47, 48, 9, 3, 2, 2, 48, 49, 7, 36, 2, 2, 49, 50, 7, 3, 2, 2, 50, 51, 5, 18, 10, 2, 51, 52, 7, 4, 2, 2, 52, 53, 7, 36, 2, 2, 53, 54, 9, 4, 2, 2, 54, 55, 7, 36, 2, 2, 55, 56, 5, 8, 5, 2, 56, 58, 3, 2, 2, 2, 57, 26, 3, 2, 2, 2, 57, 37, 3, 2, 2, 2, 57, 41, 3, 2, 2, 2, 57, 47, 3, 2, 2, 2, 58, 66, 3, 2, 2, 2, 59, 60, 12, 6, 2, 2, 60, 61, 7, 36, 2, 2, 61, 62, 7, 11, 2, 2, 62, 63, 7, 36, 2, 2, 63, 65, 5, 2, 2, 7, 64, 59, 3, 2, 2, 2, 65, 68, 3, 2, 2, 2, 66, 64, 3, 2, 2, 2, 66, 67, 3, 2, 2, 2, 67, 3, 3, 2, 2, 2, 68, 66, 3, 2, 2, 2, 69, 71, 7, 28, 2, 2, 70, 72, 5, 6, 4, 2, 71, 70, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 5, 3, 2, 2, 2, 73, 74, 7, 6, 2, 2, 74, 75, 5, 4, 3, 2, 75, 7, 3, 2, 2, 2, 76, 92, 7, 12, 2, 2, 77, 92, 7, 13, 2, 2, 78, 92, 7, 29, 2, 2, 79, 92, 7, 30, 2, 2, 80, 92, 7, 31, 2, 2, 81, 83, 7, 7, 2, 2, 82, 81, 3, 2, 2, 2, 82, 83, 3, 2, 2, 2, 83, 84, 3, 2, 2, 2, 84, 86, 7, 32, 2, 2, 85, 87, 7, 33, 2, 2, 86, 85, 3, 2, 2, 2, 86, 87, 3, 2, 2, 2, 87, 92, 3, 2, 2, 2, 88, 92, 5, 22, 12, 2, 89, 92, 5, 14, 8, 2, 90, 92, 5, 10, 6, 2, 91, 76, 3, 2, 2, 2, 91, 77, 3, 2, 2, 2, 91, 78, 3, 2, 2, 2, 91, 79, 3, 2, 2, 2, 91, 80, 3, 2, 2, 2, 91, 82, 3, 2, 2, 2, 91, 88, 3, 2, 2, 2, 91, 89, 3, 2, 2, 2, 91, 90, 3, 2, 2, 2, 92, 9, 3, 2, 2, 2, 93, 94, 7, 8, 2, 2, 94, 95, 5, 12, 7, 2, 95, 11, 3, 2, 2, 2, 96, 97, 7, 30, 2, 2, 97, 98, 7, 35, 2, 2, 98, 102, 5, 12, 7, 2, 99, 100, 7, 30, 2, 2, 100, 102, 7, 9, 2, 2, 101, 96, 3, 2, 2, 2, 101, 99, 3, 2, 2, 2, 102, 13, 3, 2, 2, 2, 103, 104, 7, 8, 2, 2, 104, 105, 5, 16, 9, 2, 105, 15, 3, 2, 2, 2, 106, 107, 7, 31, 2, 2, 107, 108, 7, 35, 2, 2, 108, 112, 5, 16, 9, 2, 109, 110, 7, 31, 2, 2, 110, 112, 7, 9, 2, 2, 111, 106, 3, 2, 2, 2, 111, 109, 3, 2, 2, 2, 112, 17, 3, 2, 2, 2, 113, 114, 5, 20, 11, 2, 114, 19, 3, 2, 2, 2, 115, 116, 5, 4, 3, 2, 116, 117, 7, 35, 2, 2, 117, 118, 5, 20, 11, 2, 118, 121, 3, 2, 2, 2, 119, 121, 5, 4, 3, 2, 120, 115, 3, 2, 2, 2, 120, 119, 3, 2, 2, 2, 121, 21, 3, 2, 2, 2, 122, 123, 7, 8, 2, 2, 123, 124, 5, 24, 13, 2, 124, 23, 3, 2, 2, 2, 125, 126, 7, 32, 2, 2, 126, 127, 7, 35, 2, 2, 127, 131, 5, 24, 13, 2, 128, 129, 7, 32, 2, 2, 129, 131, 7, 9, 2, 2, 130, 125, 3, 2, 2, 2, 130, 128, 3, 2, 2, 2, 131, 25, 3, 2, 2, 2, 14, 28, 31, 57, 66, 71, 82, 86, 91, 101, 111, 120, 130]
[4, 1, 34, 137, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 1, 0, 1, 0, 3, 0, 27, 8, 0, 1, 0, 3, 0, 30, 8, 0, 1, 0, 1, 0, 3, 0, 34, 8, 0, 1, 0, 1, 0, 3, 0, 38, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 62, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 69, 8, 0, 10, 0, 12, 0, 72, 9, 0, 1, 1, 1, 1, 3, 1, 76, 8, 1, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 87, 8, 3, 1, 3, 1, 3, 3, 3, 91, 8, 3, 1, 3, 1, 3, 1, 3, 3, 3, 96, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 106, 8, 5, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 116, 8, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 125, 8, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 135, 8, 11, 1, 11, 0, 1, 0, 12, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 0, 3, 1, 0, 12, 21, 1, 0, 22, 25, 1, 0, 13, 18, 147, 0, 61, 1, 0, 0, 0, 2, 73, 1, 0, 0, 0, 4, 77, 1, 0, 0, 0, 6, 95, 1, 0, 0, 0, 8, 97, 1, 0, 0, 0, 10, 105, 1, 0, 0, 0, 12, 107, 1, 0, 0, 0, 14, 115, 1, 0, 0, 0, 16, 117, 1, 0, 0, 0, 18, 124, 1, 0, 0, 0, 20, 126, 1, 0, 0, 0, 22, 134, 1, 0, 0, 0, 24, 26, 6, 0, -1, 0, 25, 27, 5, 8, 0, 0, 26, 25, 1, 0, 0, 0, 26, 27, 1, 0, 0, 0, 27, 29, 1, 0, 0, 0, 28, 30, 5, 34, 0, 0, 29, 28, 1, 0, 0, 0, 29, 30, 1, 0, 0, 0, 30, 31, 1, 0, 0, 0, 31, 33, 5, 1, 0, 0, 32, 34, 5, 34, 0, 0, 33, 32, 1, 0, 0, 0, 33, 34, 1, 0, 0, 0, 34, 35, 1, 0, 0, 0, 35, 37, 3, 0, 0, 0, 36, 38, 5, 34, 0, 0, 37, 36, 1, 0, 0, 0, 37, 38, 1, 0, 0, 0, 38, 39, 1, 0, 0, 0, 39, 40, 5, 2, 0, 0, 40, 62, 1, 0, 0, 0, 41, 42, 3, 2, 1, 0, 42, 43, 5, 34, 0, 0, 43, 44, 5, 3, 0, 0, 44, 62, 1, 0, 0, 0, 45, 46, 3, 2, 1, 0, 46, 47, 5, 34, 0, 0, 47, 48, 7, 0, 0, 0, 48, 49, 5, 34, 0, 0, 49, 50, 3, 6, 3, 0, 50, 62, 1, 0, 0, 0, 51, 52, 7, 1, 0, 0, 52, 53, 5, 34, 0, 0, 53, 54, 5, 1, 0, 0, 54, 55, 3, 16, 8, 0, 55, 56, 5, 2, 0, 0, 56, 57, 5, 34, 0, 0, 57, 58, 7, 2, 0, 0, 58, 59, 5, 34, 0, 0, 59, 60, 3, 6, 3, 0, 60, 62, 1, 0, 0, 0, 61, 24, 1, 0, 0, 0, 61, 41, 1, 0, 0, 0, 61, 45, 1, 0, 0, 0, 61, 51, 1, 0, 0, 0, 62, 70, 1, 0, 0, 0, 63, 64, 10, 4, 0, 0, 64, 65, 5, 34, 0, 0, 65, 66, 5, 9, 0, 0, 66, 67, 5, 34, 0, 0, 67, 69, 3, 0, 0, 5, 68, 63, 1, 0, 0, 0, 69, 72, 1, 0, 0, 0, 70, 68, 1, 0, 0, 0, 70, 71, 1, 0, 0, 0, 71, 1, 1, 0, 0, 0, 72, 70, 1, 0, 0, 0, 73, 75, 5, 26, 0, 0, 74, 76, 3, 4, 2, 0, 75, 74, 1, 0, 0, 0, 75, 76, 1, 0, 0, 0, 76, 3, 1, 0, 0, 0, 77, 78, 5, 4, 0, 0, 78, 79, 3, 2, 1, 0, 79, 5, 1, 0, 0, 0, 80, 96, 5, 10, 0, 0, 81, 96, 5, 11, 0, 0, 82, 96, 5, 27, 0, 0, 83, 96, 5, 28, 0, 0, 84, 96, 5, 29, 0, 0, 85, 87, 5, 5, 0, 0, 86, 85, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 90, 5, 30, 0, 0, 89, 91, 5, 31, 0, 0, 90, 89, 1, 0, 0, 0, 90, 91, 1, 0, 0, 0, 91, 96, 1, 0, 0, 0, 92, 96, 3, 20, 10, 0, 93, 96, 3, 12, 6, 0, 94, 96, 3, 8, 4, 0, 95, 80, 1, 0, 0, 0, 95, 81, 1, 0, 0, 0, 95, 82, 1, 0, 0, 0, 95, 83, 1, 0, 0, 0, 95, 84, 1, 0, 0, 0, 95, 86, 1, 0, 0, 0, 95, 92, 1, 0, 0, 0, 95, 93, 1, 0, 0, 0, 95, 94, 1, 0, 0, 0, 96, 7, 1, 0, 0, 0, 97, 98, 5, 6, 0, 0, 98, 99, 3, 10, 5, 0, 99, 9, 1, 0, 0, 0, 100, 101, 5, 28, 0, 0, 101, 102, 5, 33, 0, 0, 102, 106, 3, 10, 5, 0, 103, 104, 5, 28, 0, 0, 104, 106, 5, 7, 0, 0, 105, 100, 1, 0, 0, 0, 105, 103, 1, 0, 0, 0, 106, 11, 1, 0, 0, 0, 107, 108, 5, 6, 0, 0, 108, 109, 3, 14, 7, 0, 109, 13, 1, 0, 0, 0, 110, 111, 5, 29, 0, 0, 111, 112, 5, 33, 0, 0, 112, 116, 3, 14, 7, 0, 113, 114, 5, 29, 0, 0, 114, 116, 5, 7, 0, 0, 115, 110, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 116, 15, 1, 0, 0, 0, 117, 118, 3, 18, 9, 0, 118, 17, 1, 0, 0, 0, 119, 120, 3, 2, 1, 0, 120, 121, 5, 33, 0, 0, 121, 122, 3, 18, 9, 0, 122, 125, 1, 0, 0, 0, 123, 125, 3, 2, 1, 0, 124, 119, 1, 0, 0, 0, 124, 123, 1, 0, 0, 0, 125, 19, 1, 0, 0, 0, 126, 127, 5, 6, 0, 0, 127, 128, 3, 22, 11, 0, 128, 21, 1, 0, 0, 0, 129, 130, 5, 30, 0, 0, 130, 131, 5, 33, 0, 0, 131, 135, 3, 22, 11, 0, 132, 133, 5, 30, 0, 0, 133, 135, 5, 7, 0, 0, 134, 129, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 135, 23, 1, 0, 0, 0, 14, 26, 29, 33, 37, 61, 70, 75, 86, 90, 95, 105, 115, 124, 134]
Loading

0 comments on commit 247bc07

Please sign in to comment.